Apache Mod_Rewrite 不断重定向

Posted

技术标签:

【中文标题】Apache Mod_Rewrite 不断重定向【英文标题】:Apache ModRewrite keeps redirecting 【发布时间】:2018-01-14 22:22:51 【问题描述】:

我正在尝试在我的本地 Windows 机器(php、Apache 2.4)上设置一个站点,而我的重定向规则正在创建一个无限循环。我不知道为什么。

我的主机文件:

127.0.0.1   learn.loc
127.0.0.1   www.learn.loc

我的 Apache httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot "C:\websites\learn"
    ServerName learn.loc
    ServerAlias www.learn.loc
    ErrorLog "logs/learn.loc-error.log"
    CustomLog "logs/learn.loc-access.log" common

    LogLevel alert rewrite:trace2

    #PHP SETTINGS
    php_value auto_prepend_file "C:\websites\learn\noop.php"
    php_value open_basedir "C:\websites\learn"
    php_value error_log "C:\websites\learn\php_error.log"

    <Directory "C:\websites\learn">
      Options Indexes FollowSymLinks
      AllowOverride All
      Require all granted
    </Directory>  
</VirtualHost>

.htaccess(位于C:\websites\learn

RewriteEngine on
RewriteRule ^yii   /yii-v1/blog
RewriteRule ^yii/(.*)   /yii-v1/blog/$1

我尝试访问的网页位于C:\websites\learn\yii-v1\blog\index.php。当我输入learn.loc/yii 时,Web 浏览器会无限期地重定向。 ModRewrite 跟踪显示:

[rid#1330178/initial] rewrite 'yii/blog/' -> '/yii/blog'
[rid#1330178/initial] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1330178/initial] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1331880/initial/redir#1] rewrite 'yii/blog' -> '/yii/blog'
[rid#1331880/initial/redir#1] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1331880/initial/redir#1] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1334a40/initial/redir#2] rewrite 'yii/blog' -> '/yii/blog'
[rid#1334a40/initial/redir#2] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1334a40/initial/redir#2] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1335b88/initial/redir#3] rewrite 'yii/blog' -> '/yii/blog'
[rid#1335b88/initial/redir#3] trying to replace context docroot C:/websites/learn with context prefix 
[rid#1335b88/initial/redir#3] internal redirect with /yii/blog [INTERNAL REDIRECT]
[rid#1336e30/initial/redir#4] rewrite 'yii/blog' -> '/yii/blog'
...

请注意,请求 ID(第一列)不同,因此会发生某种无限递归,我不知道为什么。没有 Apache 或 PHP 错误。

【问题讨论】:

【参考方案1】:

您必须在RewriteRule 中锚定您的正则表达式模式以避免此问题:

RewriteEngine on

RewriteRule ^yii/?$   /yii-v1/blog [L,NC]

RewriteRule ^yii/(.+)$ /yii-v1/blog/$1 [L,NC]

您的正则表达式模式 ^yii 匹配任何以 /yii 开头的 URI,并且由于您重写的 URI 也以 /yii 开头,因此它会不断重写,直到 Apache mod_rewrite 模块达到在 Apache 服务器级别或由默认即10

这个限制可以在 Apache 配置中使用这个指令来改变:

RewriteOptions MaxRedirects=20

【讨论】:

谢谢你的工作。您能否解释一下发生了什么,以便我和其他人可以从我的错误中吸取教训? 是的,我刚刚添加了答案。 好的,我明白了。该网站让我接受您的回答还为时过早。您知道 ModRewrite 跟踪中的“尝试替换上下文 docroot”实际上是什么意思吗? 该行没有出现在我的重写日志中,但我相信这是一条调试级别消息,表明文件系统 DocumentRootC:/websites/learn 在重写时已被删除。

以上是关于Apache Mod_Rewrite 不断重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 apache mod_rewrite 规则重定向到动态 URL(不是经典重定向)?

Apache mod_rewrite实现HTTP和HTTPS重定向跳转

mod_rewrite,重定向并设置cookie,防止重定向循环

tomcat 或者 jsp 怎么实现301重定向

mod_rewrite 不在 XAMPP 上执行特定重定向 - 与 DirectoryIndex 冲突?

如何在没有 mod_rewrite 的情况下重定向除一个路径及其所有子路径之外的所有 URL?