我有一个网站,用于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 页面)
我没想到会这样……为什么会发生这种情况?有办法解决吗?
答案1
URLhttp://example.com/category/article
和http://example.com/category%2farticle
不相等。根据RFC 2616§3.2.3,保留字符具有特殊意义(毕竟,这是 URL 转义的全部意义所在)。 RFC 2396§2.2列出/
这样的保留字符。在 HTTP URL 上下文中,/
分隔路径元素,而 则%2f
是文字斜杠。
在 Apache 中,AllowEncodedSlashes On
将防止请求被立即以 404 代码拒绝。