Apacheのリバースプロキシでホストヘッダーを書換えない方法

最終更新日付: 2021年2月2日

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が設定されていないと、リダイレクト後に、クライアントが直接バックエンドのサーバーにアクセスしようとしてしまうということです。

ProxyPreserveHostをOnにしてハマる - Qiita

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です