Configurator_Proxyプラグイン
(Piece_Unity >= 0.12.0)
概要
Piece_Unity_Contextオブジェクトで保持されている現在のリクエストのベースパスとスクリプト名を調整するためのコンフィギュレータ
このコンフィギュレータは、アプリケーションが動作しているWebサーバが、リバースプロキシサーバのバックエンドサーバとして使用されている場合に使われます。そして、その場合のみ動作します。
コンポーネント
説明
boolean invoke (void)
リバースプロキシサーバのバックエンドサーバ上で動作しているアプリケーションは、クライアントに示されるURL(フロントエンドURL)と、アプリケーションが認識しているURL(バックエンドURL)が異なります。例えば、下記のようなマッピングを考えてみてください。
| フロントエンドURL | http://example.org/foo/bar/baz.php |
| バックエンドURL | http://foo.example.org/bar/baz.php |
実際のアプリケーション開発においては、ポータビリティのためホスト名は省略される場合が多いため、
| フロントエンドURL | /foo/bar/baz.php |
| バックエンドURL | /bar/baz.php |
のようにホスト名は無視して考えることができます。
上記は、Locationヘッダ、クッキーのパス、HTML内のリンクといった、クライアントに返されるレスポンスに含まれるパスは、http://example.org/foo/bar/baz.php なのにもかかわらず、アプリケーションが認識しているパスは、http://foo.example.org/bar/baz.php という状況を示しています。バックエンドURLをフロントエンドURLに変換するには、バックエンドURLの先頭に/fooという文字列を付与ししなければなりません。
このプラグインは、上記のようなパスを自動的に調整します。設定ポイントproxyPathに、パスのうちリバースプロキシサーバ側に付与される部分(上記の例では/foo)を設定することで、この文字列をバックエンドURLの先頭に付与します。
| オリジナル(バックエンドURL) | 調整後(フロントエンドURLに相当) | |
| ベースパス | /bar | /foo/bar |
| スクリプト名 | /bar/baz.php | /foo/bar/baz.php |
調整後の値は、Piece_Unity_ContextオブジェクトのgetBasePath(), getScriptName(), getAppRootPath()から取得することができます。(これらのメソッドは、このプラグインを使うかどうかにかかわらず、それぞれのパスの取得のために使われます。)
アプリケーションで使われるパスを、これらのメソッド(及び、これらのメソッド由来のビューエレメント__basePath/__scriptName/__appRootPath)に統一しておくと、このプラグインによって、動作環境の違いによるパスの相違問題を、簡単に解決することができます。
なお、このプラグインは、アプリケーションがリバースプロキシ環境で動作しているかどうかの判断を、サーバ変数に以下の値のいずれかが含まれているかによって行います。含まれていない場合は調整を行いません。
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- HTTP_VIA
- HTTP_X_COMING_FROM
- HTTP_COMING_FROM
リバースプロキシサーバ使用時の調整が必要なパスとその対策
このプラグインによって、リバースプロキシサーバ使用時のすべてのパス問題が解決するわけではありません。参考までに、下記に調整が必要なパスとその対策の一例を示します。
| 調整が必要なパス | Configurator_Proxyによる対策 | Apacheによる対策 |
| Locationヘッダ | NG | ProxyPassReverseディレクティブ |
| セッションクッキーのパス | adjustSessionCookiePath | ProxyPassReverseCookiePathディレクティブ (Apache 2.2以降) |
| セッションクッキーのドメイン | NG(ただしドメインを設定しない場合は対策不要) | ProxyPassReverseCookieDomainディレクティブ |
| HTML内に含まれるリンク | Piece_Unity_Context::getBasePath()/getScriptName()/getAppRootPath() | mod_proxy_htmlモジュール |
| HTML以外のレスポンスボディに含まれるリンク | Piece_Unity_Context::getBasePath()/getScriptName()/getAppRootPath() | NG |
拡張ポイント
拡張ポイントはありません。
設定ポイント
proxyPath
(Piece_Unity >= 0.12.0)
概要
アプリケーションのURLパスのうちリバースプロキシサーバ側に付与される部分
デフォルト値
null
説明
リバースプロキシサーバ使用時に、proxyPathが設定されていると、バックエンドサーバが取り扱うURLの先頭にその値が付与されます。これにより、アプリケーションがリバースプロキシサーバ側から実行された場合でも、デバッグ等で直接バックエンドサーバで実行された場合でも、アプリケーションの設定やアプリケーション内で使われるURLを一切変更する必要がなくなります。
設定ポイント
adjustSessionCookiePath
(Piece_Unity >= 0.12.0)
概要
セッションクッキーのパス(PHP設定session.cookie_pathの値)を調整します
デフォルト値
true
説明
adjustSessionCookiePathの値によって、PHP設定session.cookie_pathの値の調整も併せて行うかどうかが決定されます。デフォルトはtrue(調整する)です。
ソースコード
Piece/Unity/Plugin/Interceptor/ProxyBasePath.php
ユーザコメント
