2017-08-07 68 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