在使用Apache地址重寫mod_rewrite期間,發現,當URL和PATH_INFO中出現%2f(/)或者%5c(\), 會被認為這是個不合法的請求, Apache將會直接返回"404 (Not Found)"錯誤。
也就是說,Apache在調用 mod_proxy 或 mod_rewrite 模塊之前,就直接拒絕請求,給出404錯誤。
這樣做主要是為了防止CGI的安全漏洞發生,尤其是在腳本中使用了PATH_INFO但是又沒有做安全過濾操作的話,很容易被注入漏洞。
假定URL是安全的,即我們想用這種URL中包含這種編碼轉換的字符串,如何操作?如何解決這個問題?
有2種解決方案:
方案一:打開Apache的“AllowEncodedSlashes”指令
在Apache的配置文件(httpd.conf)中,找到 <VirtualHost> 節點,配置如下代碼即可(注意,把此規則添加到.htaccess文件中是不起作用的。)
<VirtualHost *:80> AllowEncodedSlashes On </VirtualHost>
打開此指令,告訴Apache服務器,允許URL地址中包含編碼字符串,如
http://www.example.com/books/the_lamp%2C_linux%2Fapache%2Fmysql%2Fphp_solution.html
這樣,不修改PHP代碼就可解決問題。但是,並不是所有的用戶都允許去修改Apache的配置文件,或者說,不修改Apache的配置文件,如何解決這個問題?
方案二:兩次urlencode()
$url .= urlencode(urlencode($title)) . '.html'
變成
http://www.example.com/books/the_lamp%252C_linux%252Fapache%252Fmysql%252Fphp_solution.html
具體可以參看:http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes
