2012-03-12 52 views
0

我在Apache中遇到了一些非常奇怪的行爲。我有一個標準的「讓PHP處理所有不是文件或目錄」重寫設置。。當url包含編碼的正斜槓時忽略.htaccess

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php [L] 

這將按預期除了當URL包含%2F,它是編碼的正斜槓(/)。只要發生這種情況,Apache會以404響應,這是合乎邏輯的,因爲這些路徑都不存在。但是我不明白的是爲什麼我的.htaccess中的重寫規則被忽略。

TL; DR

GET /Foo/bar/baz是我的PHP腳本

GET /Foo/bar%2Fbaz送達被Apache服務。

回答

1

自己找到答案。配置指令AllowEncodedSlashes必須設置爲on才能工作。否則,當URL包含編碼的正斜槓或反斜槓時,Apache將以404響應。

http://httpd.apache.org/docs/2.0/mod/core.html#allowencodedslashes

+0

這看起來像一個糟糕的默認行爲。在URI模式中將'%2F'與'/'區分開來是有意義的,這種保留字符將用於替代特殊用途。這將是例外而不是規則,並且當這樣的方案發生在應用程序中時,該用法將可能在URL的查詢部分之後,使用'?'字符。 – Kaz 2012-03-12 16:03:21