Apache 關於 mod_rewrite 遇到 "百分號2F"或"百分號5C" (正反斜槓)等特殊符號導致URL重寫失效出現404的問題

.htaccess 文件

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

http://localhost/Application/Home/Index/index/url/http%3A%2F%2Fwww.domain.com%2Fpage%2F

當訪問上面鏈接時,老是出現 404,重寫失效了

http://localhost/Application/Home/Index/index/url/http://www.domain.com/page/

我本地環境一直使用的 xampp ,服務器上的 nginx 沒有問題,但 apache 卻很讓人無語,老是 404,換成原樣,不經過 urlencode 反而能正常打開頁面

網上搜索了半天,終於找到原因:

當URL和PATH_INFO中出現%2f(/)或者%5c(\), 會被認爲這是個不合法的請求, Apache將會直接返回"404 (Not Found)"錯誤。

也就是說,Apache在調用 mod_proxy 或 mod_rewrite 模塊之前,就直接拒絕請求,給出404錯誤。

這樣做主要是爲了防止CGI的安全漏洞發生,尤其是在腳本中使用了PATH_INFO但是又沒有做安全過濾操作的話,很容易被注入漏洞。

解決辦法有兩個,第一個比較簡單,但需要有服務器操作的權限:

一、修改站點虛擬目錄的配置

<VirtualHost *:80>
    AllowEncodedSlashes On
    DocumentRoot "D:/htdocs/localhost"
    ServerName localhost
</VirtualHost>

配置中增加 AllowEncodedSlashes On  這句話後重啓服務即可  

二、多次 urlencode 

可以將鏈接多次 urlencode ,一般兩次,或者三次就不會有問題了。

我做了個測試,發現必須要三次才能成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章