2017-08-07 109 views
3

我试图在本地Windows机器上安装一个站点(PHP,Apache 2.4),我的重定向规则创建了一个inifinite循环。我无法弄清楚为什么。Apache ModRewrite保持重定向

主机文件:

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错误。

回答

5

必须锚定在RewriteRule你的正则表达式来避免这个问题:

RewriteEngine on 

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

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

你的正则表达式模式^yii匹配以/yii既然你重写的URI还与/yii开始,因此它不断改写,直到开始任何URI Apache mod_rewrite模块达到了在Apache服务器级别设置的最大限制或默认值,即10

RewriteOptions MaxRedirects=20 
+1

感谢您的工作:

这个限制可以在Apache的配置在使用该指令来改变。你能解释一下发生了什么,所以我和其他人可以从我的错误中学习吗? – BeetleJuice

+0

是的,我只是在答案中添加。 – anubhava

+0

好吧,我明白了。网站让我接受你的答案还为时过早。你知道在ModRewrite trace中“*试图替换上下文docroot *”究竟意味着什么? – BeetleJuice