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 创建数千个 url

使用 5 个页面的 mod-Rewrite(通配符子域)

Apache Mod-Rewrite 规则跳过子目录

我的脚本的通用 mod-rewrite htaccess 文件

Apache服务器下phalcon项目报Mod-Rewrite is not enabled问题

405使用mod-rewrite对PHP脚本的PUT请求出错