.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 ,一般兩次,或者三次就不會有問題了。
我做了個測試,發現必須要三次才能成功