PHP
WordPress
Apache

WordPressなどにリバースプロキシする際にバックエンドのホスト名でURL生成されるのを防ぐ

More than 3 years have passed since last update.

wordpressなど、バックエンド側でサーバ変数のHTTP_HOSTを使用してURLを生成しているスクリプトがある場合、リバースプロキシの設定のProxyPreserveHostをOnにすることで、バックエンドのホスト名でURLが生成されるのを防ぐことができます。

ProxyPreserveHostは、バックエンドへのプロキシの要求に、クライアントがリクエストしたホスト名を伝播します。

http://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypreservehost

バックエンドで動作しているPHPなどのスクリプトは、URLを組み立てる際$_SERVER['HTTP_HOST']を使用します。

HTTP_HOSTには、[現在のリクエストに Host: ヘッダが もしあればその内容]が入っているので、バックエンドのスクリプトは、クライアントがリクエストしたホスト名(public.co.jp)からURLを組み立てます。

http://php.net/manual/ja/reserved.variables.server.php

ただし、この方法は、バックエンドのサーバが別の用途でも使用されている場合は、注意が必要です。

特に、HTTP_HOSTを単に自ホスト名として利用しているスクリプトがある場合は、プロキシすることで、意図しないURLを生成したりするかもしれません。

<VirtualHost public.co.jp:80>

ServerName public.co.jp
DocumentRoot /var/www/html
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/access_log combined

# Reverse Proxy settings.
# Cookie's proxy settings.
ProxyPassReverseCookieDomain public.co.jp backend.co.jp
ProxyPassReverseCookiePath / /

# プロキシリクエストに、受け付けた Host HTTP ヘッダを使う.
# Using accepted Host HTTP header at proxy request.
# @see http://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxypreservehost
ProxyPreserveHost On

#wordpress
ProxyPass /wp/ http://backend.co.jp/wp/
ProxyPassReverse /wp/ http://backend.co.jp/wp/

</VirtualHost>