【问题标题】:mod-rewrite recursive loopmod-rewrite递归循环
【发布时间】: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]

这两个网址都不起作用。

【问题讨论】:

    标签: regex .htaccess mod-rewrite loops recursion


    【解决方案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 文档的头部添加一个规范链接,这将停止您的重复内容问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        • 2017-01-21
        • 2012-02-14
        相关资源
        最近更新 更多