解决URL网址中遇到%2F或%5C(正反斜杠)等特殊符号导致URL重写失效出现404的问题

在使用Apache地址重写mod_rewrite期间,发现,当URL和PATH_INFO中出现/(/)或者(), 会被认为这是个不合法的请求, Apache将会直接返回"404 (Not Found)"错误。

也就是说,Apache在调用 mod_proxy 或 mod_rewrite 模块之前,就直接拒绝请求,给出404错误。

这样做主要是为了防止CGI的安全漏洞发生,尤其是在脚本中使用了PATH_INFO但是又没有做安全过滤操作的话,很容易被注入漏洞。

假定URL是安全的,即我们想用这种URL中包含这种编码转换的字符串,如何操作?如何解决这个问题?

有2种解决方案:

方案一:打开Apache的“AllowEncodedSlashes”指令

在Apache的配置文件(httpd.conf)中,找到 节点,配置如下代码即可(注意,把此规则添加到.htaccess文件中是不起作用的。)

1
2
3
    AllowEncodedSlashes On
<</code>/VirtualHost>

打开此指令,告诉Apache服务器,允许URL地址中包含编码字符串,如

http://www.example.com/books/the_lamp,_linux/apache/mysql/php_solution.html

这样,不修改PHP代码就可解决问题。但是,并不是所有的用户都允许去修改Apache的配置文件,或者说,不修改Apache的配置文件,如何解决这个问题?

方案二:两次urlencode()

$url .= urlencode(urlencode($title)) . '.html'

变成

http://www.example.com/books/the_lamp,_linux/apache/mysql/php_solution.html

具体可以参看:http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes

原文地址:https://www.cnblogs.com/linewman/p/9918287.html