apacheのDirectory、Locationを複数書く場合(マージ)の注意点

Directory、Locationなどを複数書いて設定している場合(特にIncludeで入れ子してる時とか)は、うっかりしていると設定間違えかねないので注意ですね。

適用される順番

  1. (正規表現無し) と .htaccess を同時に(.htaccess が許可されていれば、それが を上書きします)
  2. (と
  3. を同時に
  4. を同時に

以外は、それぞれのグループは設定ファイルに現れた順番に処理されます。 (上のグループ 1) はディレクトリが短いものから長いものへと処理されます。
(中略)
Include によって挿入された設定は 挿入しているファイルの Include ディレクティブの位置にあったかのように扱われます。

セクション中のセクションはバーチャルホストの定義の外側の対応するセクションの 後に適用されます。これによりバーチャルホストが メインのサーバ設定を上書きできるようなります。

mod_proxy でリクエストが処理される場合は、処理順番のうち、 コンテナの部分が コンテナに取って代わられます。

個人的に紛らわしいのは、割と良く使われるDirectoryとLocationで適用順が違うこと。

  • Direcotryディレクティブは記述順ではなくて、ディレクトリの短い設定から順に適用されて、ディレクトリの長い設定は最後に適用される。ネットワークのルーティングで言うとロンゲストマッチのような感じ
  • Location(やその他の)ディレクティブなどについては記述順に適用される

という違い。

directory
<Directory /path/to/docroot/hoge/fuga>
  ## 設定B
</Directory>

<Directory /path/to/docroot/hoge>
  ## 設定A
</Directory>

この場合はhttp://example.com/hoge/fuga については設定Bが有効になる 設定Aを適用後、さらに設定Bを適用する。

location
<Location /hoge/fuga>
  ## 設定B
</Location>

<Location /hoge>
  ## 設定A
</Location>

この場合はhttp://example.com/hoge/fuga については設定Aが有効になる 設定Bを適用後、さらに設定Aを適用する。つまり設定Bは全くの無効な記述。

追記

すいません。一部不適切な書き方になってました。設定はマージされるだけなので、前の設定内容が全て無効になるわけではないです。設定Aと設定Bが違う種類であれば問題はないけど、同じ種類の場合は上書きされて無効になるってだけですね。が、自分の脳内では"設定A"、"設定B"をアクセス制限(allow from, deny from )に限定して書いていたため、無効になると間違って書いていました。