使用 .htaccess 排除奇怪的页面

Posted

技术标签:

【中文标题】使用 .htaccess 排除奇怪的页面【英文标题】:Excluding strange pages with .htaccess 【发布时间】:2012-07-04 13:13:34 【问题描述】:

我的网站上发生了一种奇怪的情况,谷歌认为某些 php 页面是其他 php 页面的子级。例如,我在 Google 网站管理员工具中遇到如下错误:http://domain.com/page1.php/page5.php。 page1.php 和 page5.php 都存在于网站上,但我不明白为什么 google 认为应该将一个连接到另一个。

浏览到这样的链接将加载 page1.php,但不正确。我的目标是使用 .htaccess (或其他建议)来简单地重定向到第一页,如果后面有其他页面。我是否正确地考虑了这个问题,任何人都可以提供建议来帮助我解决这个问题吗?谢谢!

更新:我的 .htaccess 文件中唯一的几行是从以前的文件夹结构重定向到单个 php 文件,但这已经存在至少一年了。例如:

RedirectMatch 301 ^/widgets/?$ http://firesage.com/widgets.php

更新 2:我刚刚在网站管理员工具中发现了这个“软 404”错误:http://domain.com/page2.php/include/include/lookup.php?id=22。首先,我通过 robots.txt 排除了包含文件夹。并且包含文件夹在 url 中列出两次的事实非常值得怀疑。

【问题讨论】:

Google 只是在跟踪链接(并读取您的站点地图文件...),因此不要让错误的链接/网址正确加载,您最好确保您的链接正是它们需要的. 奇怪的是,这些网址在谷歌搜索中找不到,而是在谷歌网站管理员工具中。他们似乎在降低我的排名,但我的站点地图很干净,我找不到使用此 URL 链接到我的站点的站点。我不知道这是从哪里来的。 这是 Google 的 crawler 在抓取您的网站时发现的... 你可以看一下交通>内部链接,看看它们是否出现在那里。 Traffic > 内部链接没有任何异常。 :( 【参考方案1】:

通常您可以使用.htaccess 重定向 Google,但我建议您找到 Google 看到这些“错误”链接的原因(s. Jeroen 对您的问题的评论)。这是.htaccess 的开始,直到您找到原因。

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /
Options +FollowSymLinks

# every page on its own
RewriteRule ^page1.php/(.*)$ /page1.php [R=301,L]
RewriteRule ^page2.php/(.*)$ /page2.php [R=301,L]
# or in general maybe the following to replace all of the above, if you think it'll fit
# RewriteRule ^([^/.]+)\.php/(.*)$ /$1.php [R=301,L]

</IfModule>

更新 如果您还需要传递任何可能的GET 参数,只需添加QSA 标志,使其变为[R=301,L,QSA]

【讨论】:

不应使用子目录访问存在此问题的页面,因此我正在寻找最简单的方法来简单地重定向到主页面。使用上面的示例,如果找到任何子目录,以下操作是否有效: RewriteRule ^page1.php/$ /page1.php [R=301,L] ?唯一的例外是当 get 变量附加到 url 时,例如 ?id=234 所以您希望将domain.com/&lt;something&gt;/pageX.php 之类的内容重定向到domain.com/pageX.php?如果是这样,&lt;something&gt; 部分呢?它应该只是dirName0-9,还是也可以是dirname0/dirname1/.../dirName9 之类的子目录?让我们先澄清一下,然后再澄清一下排除:) 很公平。页面名称不统一,因此必须为每页一行。我希望 domain.com/pageX.php/anything/here/should.be/ignored 被简单地重定向到 domain.com/pageX.php。我不确定托管服务提供商 (1and1) 是否正在协助解决该问题,但由于原始页面附加了额外的目录,因此页面无法正确加载。 我现在更新了我的答案,以符合您的标准。如您所见,您可以使用自己的RewriteRule 为每个页面执行此操作,或者我注释掉的最后一个页面会将domain.com/&lt;something&gt;.php/anything/here/should.be/ignored 重定向到domain.com/&lt;something&gt;.php 并且/ 被排除在&lt;something&gt; 之外。现在排除,您在哪里附加了 GET 参数? 完美。在我找出问题的根本原因之前,这肯定会起作用。谢谢。【参考方案2】:

我根本不是 .htaccess 方面的专家,但您的重定向规则可能很混乱。 要进行重定向,只需在 .htaccess 中使用它:

RewriteEngine On
RewriteRule ^some regex$ http://yourdomain.com/page1.php [L]

您的 .htaccess 看起来像这样吗?你能用它更新你的问题吗?

【讨论】:

【参考方案3】:

寻找指向page1.php/而不是page1.php的链接。

如果 google(或浏览器)跟随指向 page1.php/ 的链接,网络服务器将提供“正确”文件 page1.php,但 google 会认为 page1.php 是一个目录,因此会解释相对链接(到 @ 987654326@) 就像它们从“目录”page1.php 中的 索引文件 开始一样。

【讨论】:

以上是关于使用 .htaccess 排除奇怪的页面的主要内容,如果未能解决你的问题,请参考以下文章

重写规则问题:.htaccess

htaccess 重写。我不希望所有这些都被重写 - 如何排除某些页面?

htaccess 文件不适用于特殊字符

.htaccess 403 禁止排除

如何向 RewriteRule 添加条件以排除子目录中不存在的文件?

WordPress 404 模板覆盖我的 .htaccess 设置以解决 404 错误?