htaccessの実行順序と優先度


19

apacheが同じパスの異なるレベルにある.htaccessファイルを実行する順序と、その中の書き換えルールがどのように優先されるかについて、誰かが私に説明できますか?

たとえば、以下の最初の.htaccessの書き換えルールが機能せず、/blog優先順位付けされているのはなぜですか?

.htaccess in /

RewriteEngine on
RewriteBase /
RewriteRule ^blog offline.html [L]

.htaccess in /blog

RewriteEngine On
RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

PS:私は単に答えを探しているのではなく、apache / mod_rewriteの内部構造を理解する方法を探しています... これを修正する方法よりもなぜ私にとって重要なの

回答:


20

Apacheチュートリアル:.htaccessの主に「ディレクティブの適用方法」セクションを読んでください。

.htaccessファイルで見つかった設定ディレクティブは、.htaccessファイルが見つかったディレクトリとそのすべてのサブディレクトリに適用されます。ただし、上位のディレクトリに.htaccessファイルがあった可能性があることも覚えておくことが重要です。ディレクティブは、見つかった順に適用されます。したがって、特定のディレクトリにある.htaccessファイルは、ディレクトリツリーの上位にある.htaccessファイルにあるディレクティブをオーバーライドする場合があります。そして、それらは、さらに上位またはメインサーバー構成ファイル自体にあるディレクティブをオーバーライドしている可能性があります。

全文を読むと、.htaccessはもはや謎になりません。


7
mod_rewriteは特殊なケースです。書き換えルールはボトムアップで適用されます。最初にサブディレクトリのルール、次に親ディレクトリのルール。
GetFree

上記のドキュメントはApache 2.2用です。Apacheの現在のバージョンについては、代わりにこのリンクにアクセス
SherylHohman

3

RewriteOptions inherit親ディレクトリの書き換えルールを継承するために使用できます。ただし、RewriteOptionsのドキュメントに従って、親ディレクトリの書き換えルールは後で適用されます


1
親ディレクトリの書き換えディレクティブは、このステートメントがなくても適用されます(多少混乱します)が、これを使用して、親から子へのディレクティブの仮想コピー+貼り付け(異なる書き換えベースを持つ可能性がある)を実行できると思います。mod_rewriteが時々あなたの頭を混乱させるのも不思議ではありません... Argh。
サイモンイースト

2
@SimonEast「親ディレクトリの書き換えディレクティブは、このステートメントがなくても適用されます」-よろしいですか?参考文献はありますか?特に、mod_rewriteディレクティブはデフォルトで継承されません(他のモジュールとは異なります)。あなたは、必要があるだろうRewriteOptions InheritXXXXディレクティブどこかのディレクティブが継承されるようにするために。ただし、これは、Apache 2.4+ではより複雑にInheritDownなり、ディレクトリで指定できるオプションと、子ディレクトリを制御するサーバー構成が追加されます。
MrWhite
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.