解决URL中包含“%2F”导致Apache地址重写mod_rewrite失效的问题

时间:2023-03-08 16:41:46

在使用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