2017-01-05 9 views
0

Webサーバーにファイルがあり、同じパスのルールを.htaccessに書き換えるたびに、ルールは無視され、ファイルは自動的に配信されます。ファイルが.htaccessルールの代わりに最初に照合されています

<?php 
echo "hello ".$_GET['action'] 
?> 

最初は私の.htaccessが空と予想されるようにhello worldhttp://<domain-name>/test.php?action=worldエコーを訪問している次のようtest.phpを -

は、私は私のウェブサーバのpublic_htmlで唯一つのファイルを持っています。また、私のウェブホストは、/test?action=world(空の.htaccess)を訪れてもこんにちはの世界をエコーするように設定されています。

今、私はpublic_htmlで、次の.htaccessを追加します。

RewriteEngine On 
RewriteRule ^test/(\w+)$ test.php?action=$1 [NC,L] 

私は/test/worldを訪問するhello worldをエコーし​​ますが、それが起こらないことを期待して!私は応答にhelloしか得ません。今私の当初mod_rewriteが有効になっていないことを、私は変更することをテストしていると思った.htaccessに:/testmod/worldを訪問し、私の驚きに

RewriteEngine On 
RewriteRule ^testmod/(\w+)$ test.php?action=$1 [NC,L] 

が実際にhello worldをエコー!これは実際にmod_rewriteが利用可能であることを示しており、要求されたURLに対してファイルが実際に存在するときに書き換えルールが無視されることを確認します。

私の考え方は、Apacheが.htaccessのルールを通過し、要求されたルールと一致する書き換えルールの場合、内部でルールに指定されたパスにリダイレクトされるということです。しかし、それはここで起こります。最初に、要求されたURLのファイルが存在するかどうかをチェックし、存在しない場合は、書き換えルールを調べます。それとも、まったく別の何かが私のウェブホストの設定のためにここで起こっていますか? (参考、私はウェブホストとしてBluehostを使用しています)。

答えて

1

のMultiViews無効にするには、この追加:

を サーバが/ some/dir/fooへのリクエストを受信した場合:有効にすると、MultiViewsオプションが何をするかを説明し、

Options -MultiViews 

Apache docs on mod_negotiationを/ some/dir/fooは が存在しない場合、サーバは foo。*という名前のすべてのファイルを検索するディレクトリを読み取り、それらのファイルをすべて という名前の型マップに効果的に作成しますクライアントが名前の1つを要求していた場合は、同じメディアタイプとコンテンツエンコーディングがあります。 それから がクライアントの要件に最も適したものを選択し、 というドキュメントを返します。

用途:作品

Options -MultiViews 
RewriteEngine On 
RewriteRule ^test/(\w+)$ test.php?action=$1 [NC,L] 
+1

クール!私はBluehostが 'MultiViews'を有効にしていることを理解しています(これはデフォルトの動作ではないため)。これは書き換えルールよりも優先されます。これは、質問に記載されている動作を説明しています。また、それを無効にしてから、書き換えルールが存在するファイルよりも優先されることを確認しました。 –

関連する問題