2013-04-16 80 views
0

我已經放在我的根文件夾這個的.htaccess:爲什麼「RewriteRule(。*)」失敗,並且RewriteRule。*有效?

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule (.*) public/$1 [L] 
</IfModule> 

這導致500內部服務器錯誤沒有解釋。

如果我刪除paranthesis它的工作原理:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule .* public/$1 [L] 
</IfModule> 

爲什麼?這不是假設在這裏是中立的嗎?

我正在使用最新的XAMPP版本(Windows)。

+0

你的公共目錄是否有.htaccess和index.html或index.php文件? – anubhava

+1

我有點驚訝第二個作品。乍一看,它看起來像應該導致無限遞歸。 – cHao

+0

哦......所以你知道,500通常對應於Apache錯誤日誌中的消息。那應該告訴你哪裏出了問題。看看'your_xampp_dir/apache/logs/error.log'。 – cHao

回答

0

如果您將起始字符^放入,會發生什麼情況?

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule ^(.*) public/$1 [L] 
</IfModule> 
1

正則表達式組在圓括號在這種情況下表達.*匹配的一切,所以規則總是使用。由於$1是對組1的反向引用:。在這種情況下唯一的一個。

如果沒有括號,規則將映射到public/,因爲沒有組。括號內沒有任何內容。

你不給請求的例子,但類似:

http://example.com/folder1/folder2/script1/括號內的URI路徑將是folder1/folder2/script1/和替代網址:

http://example.com/public/folder1/folder2/script1/

因此,在這種情況下出現錯誤有幾個原因,有或沒有括號。該規則映射到,循環等的請求都可能會產生該錯誤。 500內部服務器錯誤是一般HTTP status code用於出錯的一切。

0

是的,圓括號對於模式是中性的。

但他們有所作爲,當您在替換中使用捕獲的字符串作爲$1。那麼規則就相當於要麼

RewriteRule (.*) public/$1 

RewriteRule .* public/ 

當你離開了括號,並與$0

RewriteRule .* public/$0 

然後你再有同樣的錯誤取代$1,此時沒有括號。