2011-03-02 45 views
0

這裏是我重寫代碼:添加斜線導致錯誤

RewriteEngine On 
    RewriteBase "/" 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
    RewriteRule (.*)$ http://www.whatever.com/$1/ [R=301,L] 

    RewriteRule ^(.*)$ index.php/$1 [L] 

這是一個表達式引擎網站。如果我把這些2行了,該網站工作正常:

RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
    RewriteRule (.*)$ http://www.whatever.com/$1/ [R=301,L] 

這些是我加入到尾部斜槓添加到任何URL,如果它沒有一個,以避免重複谷歌索引的行。它在我的日誌文件中導致這個錯誤: 請求超出l「由於可能的配置錯誤導致的10個內部重定向的限制」

我假設它沒有處理RewriteCond權限並進入無限循環。任何想法爲什麼發生這種情況?

回答

0

一,原理:任何重寫後,整個規則集從一開始就被處理。 [L]標誌不防止這種情況;它控制規則是否是當前運行的最後一個。

在這種情況下,問題是最後一條規則。它重寫這樣的事:

foo → index.php/foo → index.php/index.php/foo → ... 

當您刪除兩條線,這條規則獲得附加的!-f!-d條件,防止循環。

從這些行的分組看來,您希望將這兩個條件附加到所有以下規則。你不能做到這一點,而是可以附加相反條件的規則將停止處理:

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule^- [L] 
+0

好的解釋是,[OR]事實證明是不必要的,但實際上它已經破解了,但是,在index.php行之前將順序改變爲!-f和!-d行的位置,使它像一個魅力。謝謝! – Macgyver 2011-03-07 19:41:04

0

打開改寫記錄(RewriteLogLevel 3左右應該這樣做),以及最喜歡的,你會看到該請求被退回來回

之間
www.whatever.com/blah 
www.whatever.com/blah/ 
www.whatever.com/blah 
www.whatever.com/blah/ 
www.whatever.com/blah 
www.whatever.com/blah/ 
etc.... 
+0

沒錯,但是在代碼中導致這種行爲的原因是什麼? – Macgyver 2011-03-02 17:14:26

+0

我猜猜'壞'重寫片段中交替組中的斜線。看看rewritelog(並且提升關卡直到你看到它在做什麼)。 – 2011-03-02 17:45:53

1

這裏是我的ExpressionEngine的.htaccess從而消除拖尾斜槓,不知道你是否有偏好,但我認爲沒有它們,它看起來更好。

RewriteEngine on 

# get rid of trailing slashes 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond $1 !^(index\.php) [NC] 
RewriteRule ^(.+)\/$ /$1 [L,R=301] 

# no plain index.php either 
RewriteRule ^(index\.php)$/[L,NC,R=301] 

# rewrite index.php 
RewriteCond $1 !^(images|system|themes|favicon\.ico|robots\.txt|index\.php) [NC] 
RewriteRule ^(.*)$ /index.php/$1 [L]