リバースプロキシ先でWordpressを動かす


環境

Apache 2.2.34


サーバーA(www.sample.com)でメインサイトが動いていて、サーバーB(sub.sample.com)でWordpressが動いている時に
Apacheのリバースプロキシを使って以下のようにアクセスできるようにします。

メインサイト: https://www.sample.com/
Wordpress: https://www.sample.com/blog

なお、既に他のリバースプロキシも設定されており、極力そちらへの影響はないように設定します。
他ページ(サーバーC): https://www.sample.com/media

■サーバーAの設定

Apache設定

httpd.confなどに以下のようにリバースプロキシ設定をします。
他リバースプロキシに影響しないようにLocationで括ります。

<Location "/blog">
    ProxyPass http://sub.sample.com/blog
    ProxyPassReverse http://sub.sample.com/blog
    ProxyPassReverseCookieDomain sub.sample.com www.sample.com
    ProxyPassReverseCookiePath / /blog/
</Location>

これで/blog配下へのアクセスはサーバーB(sub.sample.com)に飛ばすようになります。

■サーバーBの設定

Apache設定

Apacheの設定はsub.sample.comにアクセスがある想定で記載しておけば大丈夫です。
WordpressソースはDocumentRoot配下にblogディレクトリを作成して格納します。

SSL通信扱いにする

これでWordpressページ自体は表示されますが、必要なJS/CSS/画像などの外部ファイルのURLが非SSLとなってしまい
Chromeなどだとエラーとなってしまいます。
なので、.htaccessに以下追記して強制的にSSL通信扱いになるようにします。

SetEnv HTTPS on

※補足
非SSLでhttp://sample.com/blogにアクセスした場合はどうするのって話もありますが、
そもそも非SSLページは推奨されないので、今回は考えてません。
http://sample.com/blogにアクセスが来たらhttps://sample.com/blogにリダイレクトしましょう。
どうしても非SSLとSSLの両方で受けたければSSL接続時はリバースプロキシ時に「X-Forwarded-HTTPS: on」を設定するなど対策してください。
「外部→(HTTPS)→ELB→(HTTP)→サーバーA→(HTTP)→サーバーB」のような構成だと結構面倒です。

ホスト名を補正する

ここまでの対応だと$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']sub.sample.comのままになってしまいます。
ページ表示上は問題無さそうですが、管理画面でブラウザのconsoleに警告が出て気持ち悪いので修正しておきます。

wp-config.phpの先頭に以下の記載を付け加えておきます。

if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) && $_SERVER['HTTP_X_FORWARDED_HOST'] === 'www.sample.com') {
    $_SERVER['HTTP_HOST'] = 'www.sample.com';
    $_SERVER['SERVER_NAME'] = 'www.sample.com';
}

これでwww.sample.comからリバースプロキシで飛ばされてきたアクセス時はホスト名が書き換わるようになりました。
(これはもっといい方法があるかもしれませんが、とりあえずこの方法でも対応できています。)