2012/11/11
リバースプロキシの設定ではまったのでメモ
Apacheでデバッグ用にドメイン名を差し替えるリバースプロキシを
立てたのだが色々はまったのでメモっとく。
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 でデータダンプしてやっと原因が分かったよ。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 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/
配下に当該ファイルが存在すればオリジンサーバより優先される。
mod_substituteとmod_proxyの組合せ
- mod_proxy経由のコンテンツにmod_substituteが効かない。
- mod_substituteをmod_proxy経由で使う時はAccept-Encodingを外す。
したがってリクエストから Accept-Encoding を削除して平文を返させるようにしている。 これ「mod_substitute mod_proxy」でググると質問ばっかりで回答が無いんだよね。 mod_ext_filter でデータダンプしてやっと原因が分かったよ。
http から https へのリダイレクト
- mod_proxy は http と https を別のサーバとみなすので リダイレクト時にドメインの差し替えをしない。
- 自力で Location ヘッダを差し替える必要有る。
Header edit
- Header always edit にすると 302 の時処理されない。
- Header edit にする。
とは言え onsuccess は 2xx だってはっきり書いてあるし... はっ、と気づいて削除したら動きました。 ただのバグのような気がするので将来的には直ってるかもしれません。