Apache

別ドメインのwebサイトをリバースプロキシで統合する方法

More than 1 year has passed since last update.

目的・条件

  • 複数の(サブ)ドメインのwebサイトを運営している。
  • クライントからは一つの(サブ)ドメインのwebサイトに見えるように統合したい。
    • 例:メインのwebサイトと関連する複数のブログサイトを運営している。ブログサイトはメインサイトとは別のレンタルサーバで運用している。メインサイトにはブログはインストールされていない、インストールしたくない。
  • メインサイトはapacheで運用しており、設定ファイルの変更は可能である。

元のサイト構成

  • https://main.mydomain/ メインwebサイト、apache2.2で動作
  • http://blog1.mydomain/  ブログサイト1、webサーバは任意
  • https://blog2.otherdomain/ ブログサイト2、webサーバは任意

やりたいサイト構成

  • https://main.mydomain/ メインwebサイト(従来通り)
  • https://main.mydomain/blog1/ ブログサイト1がこれ以下に配置される
  • https://main.mydomain/blog2/ ブログサイト2がこれ以下に配置される

apacheの設定

  • メインwebサーバのapacheの設定ファイルに以下を記述する。
ProxyRequests off
SSLProxyEngine on

<Location /blog1/>
  ProxyPass http://blog1.mydomain/
  ProxyPassReverse https://blog1.mydomain/
  ProxyPassReverseCookieDomain blog1.mydomain main.mydomain
  ProxyPassReverseCookiePath / /blog1/
  RequestHeader unset Accept-Encoding
  AddOutputFilterByType SUBSTITUTE text/plain text/html application/javascript text/javascript
  Substitute "s|http://blog1.mydomain/|https://main.mydomain/blog1/|q"
</Location>

<Location /blog2/>
  ProxyPass https://blog2.mydomain/
  ProxyPassReverse https://blog2.mydomain/
  ProxyPassReverseCookieDomain blog2.mydomain main.mydomain
  ProxyPassReverseCookiePath / /blog2/
  RequestHeader unset Accept-Encoding
  AddOutputFilterByType SUBSTITUTE text/plain text/html application/javascript text/javascript
  Substitute "s|http://blog2.mydomain/|https://main.mydomain/blog2/|q"
</Location>
  • 設定はhttpd.confまたはそこからインクルードされる設定ファイル内に記述する。.htaccessは不可
  • <VirtualHost>内に記述しても大丈夫

各設定の簡単な説明

ProxyRequests off

  • フォワードプロキシではなくリバースプロキシを使うのでoffにする。
  • <Location>内には書けない。

SSLProxyEngine on

  • プロキシのバックエンドサーバとして、httpsプロトコルのサーバがある場合、このディレクティブの値をonにする必要がある。
  • バックエンドサーバが全てhttpプロトコルの場合は、このディレクティブは不要なはず。

ProxyPass

  • リバースプロキシの最もキモの設定。この設定だけでリバースプロキシ自体は動作する。

ProxyPassReverse

  • バックエンドサーバがリダイレクトの応答(301とか302)をする場合に、リダイレクト先のパスを適切に書き換えてクライアントに返答するための設定。
  • リダイレクトしないことが確実ならこのディレクティブは必要ないが、通常は書いておく。

ProxyPassReverseCookieDomain, ProxyPassREverseCookiePath

  • バックエンドサーバがクッキーを出力する場合に、そのクッキーのドメインやパス情報を適切に書き換える。
  • クッキーを出力しないことが確実ならこれらのディレクティブは必要ないが、通常は書いておく。

RequestHeader unset Accept-Encoding

  • バックエンドサーバに、http(s)レスポンスを圧縮せずに返してもらうための設定。
  • レスポンスが圧縮されていると、後述のSubstituteが正しく動作しなくなるため、バックエンドサーバの設定によっては必要。

AddOutputFilterByType

  • 後述のSubstituteプリミティブを有効にするための設定。
  • 上の設定例では、text/htmlやtext/javascriptなど、テキスト系の主なMIMEタイプで有効になるように指定しているが、バックエンドサイトの内容によっては、他のMIMEタイプも追加する必要がある。

Substitute

  • バックエンドサーバからのレスポンス(htmlやJavaScript)内のテキストの置換を行う。
  • バックエンドサーバのhtmlのリンク等に含まれる元のバックエンドサーバURLをメインサイトに統合後のURLに書き換えるのが目的。
  • レスポンスHTML内のサイト内リンクURLが相対パスではなくフルパスで書かれている場合にクライアントでそのリンクを踏むと、メインwebサイトから「元の」ブログサイトに遷移してしまうためである。
  • バックエンドサーバのコンテンツ内容によっては、置換設定を更に追加する必要があるかもしれない。

動作確認済みのバックエンド(動作不可を含む)

さくらのレンタルサーバ上のwordpressサイト

  • 2サイトで動作OK
  • うち一つは ReqestHeader unset Accept-Encodingが必要。もう片方は不要だった。

wix

  • 動作しない。502 Bad Gatewayになってしまう。
  • 現時点で原因は不明。