2012-03-12 22 views
0

Apacheで本当に奇妙な動作が発生しました。私は標準を持っています。 "PHPはファイルやディレクトリではないすべてを処理します"リライトセットアップ。urlにエンコードされたスラッシュが含まれていると、.htaccessが無視される

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . index.php [L] 

URLがエンコードされたスラッシュ(/)で%2Fを、含まれている場合を除き、を期待通り、この作品。これが起こるたびに、Apacheは404で応答します。これらのパスは存在しないため論理的です。しかし私が理解できないことは、私の.htaccessの書き換えルールが無視される理由です。

TL; DR

GET /Foo/bar/bazは私のPHPスクリプト

GET /Foo/bar%2Fbazによって提供されるには、Apacheで提供しています。

答えて

1

自分自身で答えを見つけました。これを行うには、configディレクティブAllowEncodedSlashesonに設定する必要があります。それ以外の場合、URLにエンコードされたスラッシュまたはバックスラッシュが含まれていると、Apacheは404で応答します。

http://httpd.apache.org/docs/2.0/mod/core.html#allowencodedslashes

+0

これは悪いデフォルト動作のようです。この予約文字が別の特殊目的のために使用されるURIスキームでは、 '%2F'と'/'を区別することだけが理にかなっています。これはルールではなく例外になるでしょう。アプリでこのようなスキームが発生すると、 '? '文字の後にURLのクエリ部分で使用される可能性が高くなります。 – Kaz

関連する問題