【问题标题】:Redirect loop with simple htaccess rule使用简单的 htaccess 规则重定向循环
【发布时间】:2013-09-29 02:26:27
【问题描述】:

我一直在努力解决这个问题。它在服务器迁移之前工作!

好的,基本上就这么简单:

我有一个 .php 文件,我想通过重写规则查看使用 SEO 友好 URL 的内容。

为了规范化和防止重复内容,我想将 .php 版本 301 转换为 SEO 友好版本。

这是我在新服务器上使用的并且一直工作到现在:

RewriteRule ^friendly-url/$ friendly-url.php [L,NC]
RewriteRule ^friendly-url.php$ /friendly-url/$1 [R=301,L]

然而灾难已经发生,现在它导致了重定向循环。

从逻辑上讲,我只能假设在这个版本的 Apache 中它正在跳闸,因为它看到正在运行的脚本是 .php 版本,所以它再次尝试重定向。

我怎样才能重新工作以使其正常工作?或者我需要在WHM中切换配置吗?

谢谢!!

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite


    【解决方案1】:

    这就是你的.htaccess 的样子:

    Options +FollowSymLinks -MultiViews 
    
    RewriteEngine On
    RewriteBase /
    
    # To externally redirect /friendly-url.php to /friendly-url/
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(friendly-url)\.php [NC]
    RewriteRule ^ /%1/? [R=302,L]
    
    ## To internally redirect /anything/ to /anything.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
    RewriteRule ^(.+?)/$ $1.php [L]
    

    注意我是如何使用R=302的,因为我不希望规则在我的浏览器上缓存,直到我确认它按预期工作,然后,一旦我可以确认它按预期工作,我从R=302切换到R=301.

    请记住,由于您使用的是 R=301,因此您可能还因之前的尝试而被缓存,因此您最好尝试从您使用过的其他浏览器访问它,以确保其正常工作。

    然而灾难已经发生,现在它导致了重定向循环。

    它会导致重定向循环,因为您将其重定向到自身,我的代码的不同之处在于我捕获请求,并从那里重定向 php 文件以使其友好,然后使用内部重定向。

    【讨论】:

    • 这是一个真的很好的答案,但是我需要在每个文件的基础上这样做,因为我的网站很旧并且由于在一个可以处理的好的 CMS 上重新构建这些所有。同时我会检查浏览器的缓存。谢谢!
    • 还有什么 -MultiViews 出于兴趣?
    • 仅查看单个 URL 的更新,您也可以使用(friendly-url|anotherurl|another) 而不是复制多个规则。 As for -MultiViews, see here.
    • 谢谢@Prix 你能分解内部重定向中发生的事情吗,因为我担心如果我有一个目录,那么我们不想以.php 为例。只是测试一下!
    • @Stefan RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(friendly-url)\.php [NC] 更具体地说 /+(friendly-url)\.php 正在查看您的 URL 是否为:http://domain.com/friendly-url.php,如果是,则它只需要它的 friendly-url 部分并重定向到代码 http://domain.com/friendly-url/底部负责获取任何不存在的 URL,例如 http://domain.com/friendly-url/,但有一个可用的 php 文件并在内部重定向到该 PHP 文件,所以简而言之,如果一个文件夹以该名称存在,它将不会重定向。跨度>
    【解决方案2】:

    完全相同的 .htaccess 文件将根据其放置的位置而有所不同,因为 [L]ast 标志的含义因位置而异。在 ...conf 中,[L]ast 表示所有已完成的处理,所以退出,但在 .htaccess 中,完全相同的 [L]ast 标志表示 从该文件的顶部重新开始

    要在将代码块从 ...conf 移动到 .htaccess 时按预期工作,大多数 .htaccess 文件都需要进行以下调整:

    • 将 [L]ast 标志更改为 [END]。 (问题是,[END] 标志仅在较新的 [2.3.9 及更高版本] Apache 中可用,在早期版本中甚至不会“回退”。)

    • 在每个 .htaccess 文件的顶部添加这样的样板代码:

    *

    RewriteCond %{ENV:REDIRECT_STATUS} !^[\s/]*$
    RewriteRule ^ - [L]
    

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2016-04-25
      • 2019-09-16
      • 2015-01-04
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      相关资源
      最近更新 更多