mod-rewrite递归循环
Posted
技术标签:
【中文标题】mod-rewrite递归循环【英文标题】:mod-rewrite recursive loop 【发布时间】:2011-08-04 02:33:00 【问题描述】:我想将我网站的动态网址更改为搜索引擎友好网址
现在像这样的网址 www.website.com/news.php?id=127591 , 我希望它变成这个 www.website.com/news/127591/this-is-article-subject
我添加了这个
RewriteRule ^news/([0-9]+) /news.php?id=$1 [PT]
在我的 .htaccess 文件中。 /news.php?id=123 中的所有内容都更改为 /new/123/this-is-article-subject
问题是,现在我有两个链接指向相同的内容。 /news.php?id=123 和 /new/123/this-is-article-subject 都是完全重复的内容
据说如果搜索引擎发现重复的内容会惩罚这个。
我在网上查了答案,发现了这个,
RewriteCond %QUERY_STRING ^id=([0-9]+)
RewriteRule ^news\.php /news/%1? [R=301,L]
HTTP 301 永久重定向从旧 URL 到新 URL。
但这仍然有问题。当我将这三行放在一起时,它不起作用。
RewriteRule ^news/([0-9]+) /news.php?id=$1 [PT]
RewriteCond %QUERY_STRING ^id=([0-9]+)
RewriteRule ^news\.php /news/%1? [R=301,L]
我猜原因是递归循环。我该如何解决这种问题?
谢谢!
更新
我改成了这个
RewriteRule ^news/([0-9]+) /news.php?id=$1 [L]
RewriteCond %QUERY_STRING ^id=([0-9]+)
RewriteRule ^news\.php /news/%1? [R=301,L]
这两个网址都不起作用。
【问题讨论】:
【参考方案1】:请在您的 .htaccess 文件中尝试此规则:
RewriteEngine on
Options +FollowSymlinks -MultiViews
RewriteCond %THE_REQUEST \?id=([0-9]+)\s [NC]
RewriteRule ^news\.php /news/%1? [R=301,L]
RewriteRule ^news/([0-9]+) /news.php?id=$1 [L,NS,NE,QSA,NC]
更新:: 根据你的 cmets:
在news.php
内部,当URL 没有/some-title
时,输出此META 标签以停止索引/news/987
类型URI:
<meta name="robots" content="NOINDEX, NOFOLLOW">
一旦您注意到news.php
内的/news/987/some-title
URI,只需在META 标记上方进行掩码。
我已经对其进行了测试,似乎工作正常,所以如果不适合您,请告诉我。
【讨论】:
谢谢!有用。我是否需要在 robots.txt 中禁止:/news.php 以防止搜索引擎索引?就像@Jonathan 说的那样。如果不允许,我想会同时禁用 news/123 和 news.php?id=123 robots.txt 仅适用于搜索引擎。在这种情况下,由于 URL 重定向已经使用 R=301 进行到/news/1234
,因此搜索两者都只会索引它而不是 /news.php。
@anubhava,google 搜索引擎似乎将 /new/123/this-is-article-subject 和 /new/123 视为不同的链接。实际上在我的网站上它们是相同的链接。如何防止谷歌索引 /new/123 ?
@Don:如果您看到我的答案或您接受的答案,那么两者都不处理主题部分some-subject
。我的规则是1) 进行从/news.php?id=987
到/news/987
的外部重定向 和2) 进行内部重定向 b> 从/news/987
或/news/987/some-title
到/news.php?id=987
。浏览器仍会显示/news/987
或/news/987/some-title
,这就是Google 将两者都编入索引的原因。请理解,仅使用 mod_rewrite 不可能将 /news.php?id=987
变为 /news/987/some-title
,因为 some-title
在原始查询字符串中不存在。
@anubhava:感谢您的帮助!我怎么能让搜索引擎知道 /news/987 或 /news/987/some-title 是同一篇文章。现在我正在做的是在我的 php 代码中,当 url 类似于 /news/987 时,将重定向到 /news/987/some-title 。但似乎谷歌搜索引擎仍然认为它们是两个不同的网址。我检查了谷歌网络管理员工具。据说两个链接的标题和元信息重复。【参考方案2】:
您需要检查HTTP request line(即%THE_REQUEST
)中的URI,因为另一个可能已经被重写(就像您的情况一样):
RewriteCond %THE_REQUEST ^GET\ /news\.php\?
RewriteCond %QUERY_STRING ^id=([0-9]+)
RewriteRule ^news\.php /news/%1? [R=301,L]
【讨论】:
我收到 500 内部服务器错误。内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。 @Don Li:我只是忘了逃离这个空间。修好了。 @Gumbo:感谢指正!我是否需要在 robots.txt 中禁止:/news.php 以防止搜索引擎索引?就像@Jonathan 说的那样。如果不允许,我想不会同时允许 news/123 和 news.php?id=123 @Don Li:不,重定向会解决这个问题。 @Gumbo:很好奇为什么在重写规则的替换文本末尾有一个?
?【参考方案3】:
如果您只关心搜索引擎,您可以创建一个 robots.txt 文件,其中包含:
User-agent: *
Disallow: /news.php
这将确保搜索引擎不会跟踪 news.php 链接。
要修复重写规则,您可以尝试将 L
添加到第一个 RewriteRule
以确保 mod_rewrite 不会继续:
RewriteRule ^news/([0-9]+) /news.php?id=$1 [PT,L]
RewriteCond %QUERY_STRING ^id=([0-9]+)
RewriteRule ^news\.php /news/%1? [R=301,L]
【讨论】:
不能使用这个。我收到以下消息。页面未正确重定向 Firefox 检测到服务器正在以永远不会完成的方式重定向此地址的请求。此问题有时可能是由禁用或拒绝接受 cookie 引起的。【参考方案4】:尝试使用 L
[L]
而不是
[PT]
【讨论】:
无效。我收到错误消息。页面未正确重定向 Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。此问题有时可能是由禁用或拒绝接受 cookie 引起的。【参考方案5】:如果 [L]
对您不起作用,则问题可能是单独的内部请求(而不是您可以使用 [NS]
停止的子请求)。
见here。
【讨论】:
【参考方案6】:最简单的答案只是在您的 html 文档的头部添加一个规范链接,这将停止您的重复内容问题。
【讨论】:
以上是关于mod-rewrite递归循环的主要内容,如果未能解决你的问题,请参考以下文章
我的脚本的通用 mod-rewrite htaccess 文件