INNOBASE技術ブログ

技術的なことエンジニア的なこと制作的なこと全般

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の問題もない