Interceptor_ProxyBasePathプラグイン
Piece_Unity 0.12.0以降、このプラグインは非推奨になりました。代わりに、Configurator_Proxyプラグインを使用してください。
概要
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という文字列を付与ししなければなりません。
このプラグインは、上記のようなパスを自動的に調整します。Configurator_Envプラグイン?の設定ポイントproxyPath?に、パスのうちリバースプロキシサーバ側に付与される部分(上記の例では/foo)を設定することで、この文字列をバックエンドURLの先頭に付与します。
| オリジナル(バックエンドURL) | 調整後(フロントエンドURLに相当) | |
| ベースパス | /bar | /foo/bar |
| スクリプト名 | /bar/baz.php | /foo/bar/baz.php |
調整後の値は、Piece_Unity_ContextオブジェクトのgetBasePath()/getScriptName()から取得することができます。(これらのメソッドは、このプラグインを使うかどうかにかかわらず、それぞれのパスの取得のために使われます。)
アプリケーションで使われるパスを、これらのメソッド(及び、これらのメソッド由来のビューエレメントbasePath/scriptName)に統一しておくと、このプラグインによって、動作環境の違いによるパスの相違問題を、簡単に解決することができます。
なお、このプラグインは、アプリケーションがリバースプロキシ環境で動作しているかどうかの判断を、サーバ変数に以下の値のいずれかが含まれているかによって行います。含まれていない場合は調整を行わずにtrueを返し、プラグインの実行を終了します。
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- HTTP_VIA
- HTTP_X_COMING_FROM
- HTTP_COMING_FROM
リバースプロキシサーバ使用時の調整が必要なパスとその対策
このプラグインによって、リバースプロキシサーバ使用時のすべてのパス問題が解決するわけではありません。参考までに、下記に調整が必要なパスとその対策の一例を示します。
| 調整が必要なパス | Interceptor_ProxyBasePathによる対策 | Apacheによる対策 |
| Locationヘッダ | NG | ProxyPassReverseディレクティブ |
| セッションクッキーのパス | adjustSessionCookiePath | ProxyPassReverseCookiePathディレクティブ (Apache 2.2以降) |
| セッションクッキーのドメイン | NG (ただしドメインを設定しない場合は対策不要) | ProxyPassReverseCookieDomainディレクティブ |
| HTML内に含まれるリンク | Piece_Unity_Context::getBasePath()/getScriptName() | mod_proxy_htmlモジュール |
| HTML以外のレスポンスボディに含まれるリンク | Piece_Unity_Context::getBasePath()/getScriptName() | NG |
拡張ポイント
拡張ポイントはありません。
設定ポイント
adjustSessionCookiePath
デフォルト値
true
概要
セッションクッキーのパス(PHP設定session.cookie_pathの値)を調整するかどうかを示すブーリアン値。
説明
adjustSessionCookiePathの値によって、PHP設定session.cookie_pathの値の調整も併せて行うかどうかが決定されます。デフォルトはtrue(調整する)です。
ソースコード
Piece/Unity/Plugin/Interceptor/ProxyBasePath.php
ユーザコメント
