ProxyPass と RewriteRule を同時に使用する場合の適応順番について Apache2.2
概要
Apache2.2上で ProxyPass (mod_proxy) と RewriteRule (mod_rewrite) が入り乱れた時どのように動作するかまとめる。
そもそも RewriteRule だけで書きなおしたほうがスッキリしますが、本番環境などすでに歴史的経緯で混ざってしまった状況で影響範囲を最低限にしたいときとかの参考に(なぜこの記事を書くことになったかお察し下さい)
ProxyPassだけで書かれた場合、RewriteRule だけで書かれた場合は上から順に処理
ProxyPass だけで書かれているパターン
ProxyPass /aaa/bbb/ http://192.168.0.2/aaa/bbb/ ProxyPass /aaa/ http://192.168.0.3/aaa/ ProxyPass /aaa/ccc/ http://192.168.0.4/aaa/ccc/ #2行目で /aaaa/ にproxyされてしまうのでこの設定は効かない
RewriteRule だけで書かれているパターン
RewriteEngine On RewriteRule ^/bbb/aaa/(.*)$ http://192.168.0.10/bbb/aaa/$1 [L,R] RewriteRule ^/bbb/(.*)$ http://192.168.0.11/bbb/$1 [L,R] RewriteRule ^/bbb/ccc/(.*)$ http://192.168.0.12/bbb/ccc/$1 [L,R] #2行目で /bbb/ にredirectされてしまうのでこの設定は効かない
※ RewriteRule の場合[L]をつけることで、それ以降のRewriteRule を無視することを指示できます。逆に[L]を付けないと次のRewriteRuleを実行します。
ProxyPass RewriteRule 両方ある場合は RewriteRule が先に処理される
ProxyPass /aaa/ http://192.168.0.3/aaa/ #3行目のRewriteRuleが優先されてしまいこの設定は働かない RewriteEngine On RewriteRule ^/aaa/(.*)$ http://192.168.0.11/aaa/$1 [L,R]
わからなくなったら RewriteRule で全て書き直すとよいかも
RewriteEngine On RewriteRule ^/aaa/(.*)$ http://192.168.0.11/aaa/$1 [L,P]
[P] 指定をすることで RewriteRule でProxyを設定できる。ReverseProxyも重ねて書くことができるのでReverseの問題もない