apacheでリバースプロキシを設定すると、デフォルト設定ではhttpリクエストのホストヘッダーを書換えてしまします。
クライアントからのリクエストのホストヘッダーのままで(書換えないで)、バックエンドのサーバーにプロキシするためのオプションはどれでしょうか?
レジュメ
環境・前提条件
Amazon Linux2の上に、apacheをインストールし、バックエンドのサーバーの代わりに、ALBを用意し、ホストヘッダーのリクエスト状態を確かめました。
- httpd-2.4.37-1.amzn2.0.1.x86_64
- mazon Linux release 2 4.14.104-95.84.amzn2.x86_64
ちなみに、AWSのロードバランサーALBはホストヘッダーを書換えずにクライアントからのリクエストをそのままロードバランスします。
ALB2の設定は以下のようにします。
結論、httpd.confのProxyPreserveHostをOnで設定する
ProxyPreserveHost ディレクティブはデフォルトでoffなのですが、onに変えることにより、クライアントリクエストのホストヘッダーにそのまま伝えることが出来ます。
ただし、ProxyPreserveHost Onにする時は注意が必要!
ただし、ProxyPreserveHostをOnにする時は注意が必要です。
リバースプロキシのバックエンドのサーバーがリダイレクトした時にアクセス出来ない問題が発生することがあります。
以下のサイトの説明がわかり易いです。
【apache】 ProxyPreserveHost を On にするとはまる(こともある) at softelメモ
この問題を解決するには、リバースプロキシのパスと、バックエンドサーバーのパス階層を一致させておきましょう。
ProxyPreserveHost On
ProxyPass /xxxx/ http://192.168.123.123/xxxx/
ProxyPassReverse /xxxx/ http://<host-header>/xxxx/
そして、以下の ProxyPassReverseの設定をしましょう。
ちなみにリバースプロキシ設定のProxyPassとProxyPassReverseの違い
ProxyPassは、バックエンドのサーバーにリバースプロキシするための設定です。
では、「ProxyPassReverseは一体何か?」と言いますと、バックエンドのサーバーはリダイレクトを返した時に、リダイレクト先(Location)のURLを書換えてくれるオプションです。
ProxyPassReverseが設定されていないと、リダイレクト後に、クライアントが直接バックエンドのサーバーにアクセスしようとしてしまうということです。