web-dev-qa-db-ja.com

htaccessの実行順序と優先度

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

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

/の.htaccess

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

/blogの.htaccess

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

PS:私は単に答えを探しているのではなく、Apache/mod_rewriteの内部を理解する方法を探しています... whyはこれを修正するためにhowよりも重要です、

19
ChrisR

Apache Tutorial:.htaccess を読む必要があると思います。主に「ディレクティブの適用方法」セクションで、

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

それに完全な読み取りを与えると、.htaccessはもう謎になりません。

20
coredump

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

3
Lèse majesté