使用mod重写和URL清理URL编码字符导致404?

我有一个网站使用mod_rewrite来获取一些干净的url和自定义404页面。 我的.htaccess文件如下所示:

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

让我感到困惑的是,如果URL包含%2F (url-encoded / ),服务器似乎强制一个404。例如, http://example.com/category/article将是一个正常的文章,但然后http://example.com/category%2farticle给出一个服务器生成的404页面。 (不是自定义404页面)

我不会期望这…这是为什么发生? 有没有办法解决它?

urlhttp://example.com/category/articlehttp://example.com/category%2farticle不相等。 根据RFC 2616§3.2.3 ,保留字符具有特殊的意义(毕竟是URL转义的整个点)。 RFC 2396§2.2列出了/作为这样一个保留的字符。 在HTTP URL的上下文中, /分隔了path元素,而%2f是字面斜杠。

在Apache中, AllowEncodedSlashes On会阻止请求被404立即拒绝。