Apacheでデバッグ用にドメイン名を差し替えるリバースプロキシを 立てたのだが色々はまったのでメモっとく。

mod_substituteとmod_proxyの組合せ

  • mod_proxy経由のコンテンツにmod_substituteが効かない。
  • mod_substituteをmod_proxy経由で使う時はAccept-Encodingを外す。

× マニュアルに書いてある設定

LoadModule substitute_module modules/mod_substitute.so AddOutputFilterByType SUBSTITUTE text/html application/x-javascript text/javascript text/css Substitute s/origin.com/debug.com/ni

○ プロキシで必要な設定

LoadModule substitute_module modules/mod_substitute.so LoadModule headers_module modules/mod_headers.so RequestHeader unset Accept-Encoding AddOutputFilterByType SUBSTITUTE text/html application/x-javascript text/javascript text/css Substitute s/origin.com/debug.com/ni

mod_substitute はコンテンツの文字列置換を行うのだが オリジンサーバがコンテンツを圧縮して返してくるとそのまま処理してしまうため 誤動作する。
したがってリクエストから Accept-Encoding を削除して平文を返させるようにしている。

これ「mod_substitute mod_proxy」でググると質問ばっかりで回答が無いんだよね。 mod_ext_filter でデータダンプしてやっと原因が分かったよ。

http から https へのリダイレクト

  • mod_proxy は http と https を別のサーバとみなすので リダイレクト時にドメインの差し替えをしない。
  • 自力で Location ヘッダを差し替える必要有る。

× これだけじゃダメ

ProxyPassReverse / http://www.origin.com/

○ Location は自前で処理

LoadModule headers_module modules/mod_headers.so ProxyPassReverse / http://www.origin.com/ Header edit Location \.origin\.com .debug.com

ログイン画面で http から https にリダイレクトする事は普通に有ると思うんだけど mod_proxy はここでリバースプロキシが切れてしまう。 プロトコルから一致していないと Location の変換は行わないらしい。

ポートが異なるので別のサーバと言う解釈かもしれないが少し杓子定規すぎないか? せめてオプションで対応してほしかった。

結局、Location を自前で差し替えて回避した。

Header edit

  • Header always edit にすると 302 の時処理されない。
  • Header edit にする。

× alwaysって全部じゃ無いの?

Header always edit Location \.origin\.com .debug.com

○ これならOK

Header edit Location \.origin\.com .debug.com

まず、そもそも edit コマンドが日本語マニュアルに無い。 差し替え機能が無いはず無いと思って英語版をみたら有った。何だかなー。

condition の使い方が良く分からなかったんで always なら間違い無いだろうと思って指定したら反応しない。
とは言え onsuccess は 2xx だってはっきり書いてあるし... はっ、と気づいて削除したら動きました。

ただのバグのような気がするので将来的には直ってるかもしれません。

ローカルファイルでオーバライド

はまって無いけど以外と情報に辿り付けなかったのでメモ。 LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine on RewriteCond "D:/docroots/debug/%{REQUEST_FILENAME}" -f RewriteRule ^(.+) "D:/docroots/debug/$1" [L,QSA]

これで D:/docroots/debug/ 配下に当該ファイルが存在すればオリジンサーバより優先される。

その他

hosts を書き換えて www.origin.com を www.debug.com に振り向ければ こんなにややこしい設定は不要で mod_proxy だけでうまく行く。

今回は客先ドメイン内での当該ドメインの書き換えがセキュリティの関係で 出来なかったのでプロキシ側で全て吸収する必要があった。