はじめに
Apache HTTP Server(以下、Apache)でURLがらみの設定をする際のメモです。
URL関連では、Redirect系、Rewrite系、ProxyPass系を使うことが多いかと思います。これらの設定の順序に関してメモにまとめたいと思います。
順序
判定順序
Apacheは以下の順序で判定を行います。
Rewrite系ProxyPass系Redirect系
Rewrite系は処理を行うのみ(継続するか、そこで終わるかは指定しだい)ですが、ProxyPass系とRedirect系はマッチする定義があるとそれ以降の判定を行いません。
Rewrite系内の判定順序
定義として書いてある順番に順次判定していきます。
ProxyPass系内の判定順序
定義として書いてある順番に順次判定していき、最初に条件にマッチした設定を実行します。このため、以下の順序で書くと混乱が少なくなります。
- プロキシーを否定する
ProxyPassあるいはProxyPassMatchの定義(例:ProxyPass /example-path !)をURL-pathの長い順に記述 - プロキシーを設定する
ProxyPassあるいはProxyPassMatchの定義(例:ProxyPass /source-path/ http://appserver/destination-path/)をURL-pathの長い順に記述
Redirect系
定義として書いてある順番に順次判定していき、最初に条件にマッチした設定を実行します。このため、URL-pathが長い順番に記述したほうが混乱が少なくなります。
なお、Redirect系の定義の優先順位はProxyPass系よりも低いため、ProxyPass系でプロキシー設定したURL-path範囲内には、そのままでは設定できません。このため、ProxyPass系でプロキシーを設定した範囲内のURL-pathに対してRedirect系を設定する場合には、個別にそのRedirect系の対象としたいURL-pathをProxyPass系のプロキシー対象から外す(否定する)設定を併用する必要があります。
上記を考慮した記述順序
一例として、上記を考慮した記述順序を以下に示します。
Rewrite系ProxyPass系のプロキシー否定をURL-pathが長い順に記述RedirectProxyPass系のプロキシー設定をURL-pathが長い順に記述
実際には必ずしもこの順序ではなくてもよいかと思います。3と4は逆でも効果に差はありません。Redirect系を常に優先したいのであれば、Redirect系の記述とProxyPass系のプロキシー否定記述をセットで書いてしまうのも手かもしれません。
注意事項
URL-pathを変更する場合は順番を再考慮しましょう。その行の変更だけに注目して順番を再配置せずに変更を行うとうまくいかない状況に陥ることがあります。理由はここでの説明の通りなわけですが…。
まとめ
設定の判定順序と設定内の判定順序が絡むため、個別の設定だけを見ているとなぜ設定が効かないのか、あるいは予期しない動きをするのかわかりづらいことがあります。個別の設定があっているのになぜかうまくいかない場合は、その他の記述部分も確認するとよいかと思います。