SOFTELメモ

</> 技術者募集

【apache】 ProxyPreserveHost を On にするとはまる(こともある)

問題

リバースプロキシを設定していて、以下のようにしているのですが、

ServerName example.com
ProxyPreserveHost On
ProxyPass /xxxx/ http://192.168.123.123/
ProxyPassReverse /xxxx/ http://192.168.123.123/

末尾スラッシュなしでディレクトリへのアクセスがあったときなどに、どうも想定外のURL(上の階層)にリダイレクトされます。

https://example.com/xxxx/images
↓
http://example.com/images/

答え

ProxyPreserveHost は、デフォルト Off で、公式ドキュメントには以下の記述があります。

このオプションは通常は Off に設定してください。 ほとんどの場合、これは大量の名前ベースのバーチャルホスティングを行なっていて、 元々の Host ヘッダをバックエンドサーバが解釈する必要のあるときのような、 特別な設定が必要な場合にのみ有用です。

ProxyPreserveHost On が有用なのは特別な場合と書かれている通り、安易に「アクセスされた時のホスト名をバックエンドに渡したいな…」と思って On にすると、困った問題が発生する場合があります。

問題の設定例だと、バックエンドにホスト名が伝わり、バックエンドがUseCanonicalName Off(デフォルト)であれば、以下のように、バックエンドから返ってくるリダイレクト先URLがバックエンドに伝えたホスト名になり、ProxyPassReverse の設定にもマッチせず、変換がかからないままブラウザに返されることになる。https:// が http:// に変わってしまっているのも問題でしょう。

proxy-preserve-host-on

ProxyPreserveHost Off であれば、素直な動きで、設定どおり変換が入り、特に問題ないと思う。

proxy-preserve-host-off

問題があるとすれば、バックエンド側がホスト名を期待しているとか、IPアドレスでは困るといった場合だが、調整可能な問題だと思います。

まとめ

本当に必要でない限りは ProxyPreserveHost Off で何とかするのが、素直な動きをする。

関連するメモ

コメント