mod_rewrite
クリーンな URL とカスタム 404 ページを取得するためにを使用している Web サイトがあります。.htaccess
ファイルは次のようになります。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?clean_url=$1 [QSA,L]
</IfModule>
私を困惑させるのは、URL に%2F
(URL エンコードされた/
) が含まれている場合、サーバーが 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 で即座に拒否されるのを防ぎます。