apache2.2のproxyの設定に悩む

サイトAでサービスサイト、サイトBでwordpressを利用したサイトを運営していたのですが、サイトAのサブディレクトリにアクセスしたときにサイトBのwordoressが表示されるようにproxyの設定をしたのですが、その時にハマったのでまとめておきます。

●サイトA

apache2.2でhttpsで構成されています。urlは https://www.site-a.com とします。

●サイトB

nginxでhttpsで構成されています。urlはhttps://wp.site-b.comとします。

Googleなどで調べたところ、サイトAのサブディレクトリwpにアクセスしたときにサイトBのwordpressが表示するには、ssl.confファイルなどに以下のように設定するということだったので、設定をしました。

SSLProxyEngine on
<Location /wp>
ProxyPass https://wp.site-b.com
ProxyPassReverse https://wp.site-b.com
ProxyPassReverseCookieDomain wp.site-b.com www.site-a.com
ProxyPassReverseCookiePath / /wp
</Location>

一般ユーザとして表示を確認したところ、問題はなかったのですが、管理者ページの投稿一覧の「タイトル」などのソートリンクや検索窓での検索が期待通りではありませんでした。

「タイトル」などのソートリンクについては、URLがサイトBのURLのままになっていたので、以下を追加し、レスポンスボディを書き換えることで対応しました。(HTMLやJavascript内に含まれるwp.site-b.comをwww.site-a.com/wpに書き換えてます)

RequestHeader unset Accept-Encoding
AddOutputFilterByType SUBSTITUTE \
        text/html \
        application/json \
        application/javascript \
        text/javascript \
        text/css
Substitute "s|wp.site-b.com|www.site-a.com/wp|ni"

検索窓については、サイトBに行ったあと、サイトAにリダイレクトされているのですが、このとき「/wp/wp-admin/edit.php」にリダイレクトされてほしいのですが、「/wp-admin/edit.php」にリダイレクトされていることが原因でした。Googleなどで調べて

ProxyPassReverse https://wp.site-b.com

があるとリダイレクトにも対応されると思ったのですが、期待通りにならなかったので、レスポンスヘッダ自体を以下のように書き換えることで対応しました。(Locationヘッダの/wp-admin/を/wp/wp-admin/に書き換えてます)

Header edit Location ^/wp-admin/ /wp/wp-admin/

最終的に設定ファイルは以下のようになりました。

<IfModule mod_ssl.c>
<VirtualHost 111.222.333.444:443>

SSL関係の設定

SSLProxyEngine on
<Location /wp>
ProxyPass https://wp.site-b.com
ProxyPassReverse https://wp.site-b.com
ProxyPassReverseCookieDomain wp.site-b.com www.site-a.com
ProxyPassReverseCookiePath / /wp
Header edit Location ^/wp-admin/ /wp/wp-admin/
RequestHeader unset Accept-Encoding
AddOutputFilterByType SUBSTITUTE \
        text/html \
        application/json \
        application/javascript \
        text/javascript \
        text/css
Substitute "s|wp.site-b.com|www.site-a.com/wp|ni"
</Location>

</VirtualHost>
</IfModule>