はじめに
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が長い順に記述Redirect
ProxyPass
系のプロキシー設定をURL-pathが長い順に記述
実際には必ずしもこの順序ではなくてもよいかと思います。3と4は逆でも効果に差はありません。Redirect
系を常に優先したいのであれば、Redirect
系の記述とProxyPass
系のプロキシー否定記述をセットで書いてしまうのも手かもしれません。
注意事項
URL-pathを変更する場合は順番を再考慮しましょう。その行の変更だけに注目して順番を再配置せずに変更を行うとうまくいかない状況に陥ることがあります。理由はここでの説明の通りなわけですが…。
まとめ
設定の判定順序と設定内の判定順序が絡むため、個別の設定だけを見ているとなぜ設定が効かないのか、あるいは予期しない動きをするのかわかりづらいことがあります。個別の設定があっているのになぜかうまくいかない場合は、その他の記述部分も確認するとよいかと思います。