web-dev-qa-db-ja.com

Apacheを使用したプロキシ設定でロケーション応答ヘッダーを書き換える方法は?

OpeenSSOがインストールされているセカンダリプロキシにリクエストを送信するプライマリプロキシがあります。

OpenSSOエージェントは、ユーザーがログインしていないと判断した場合、認証サーバーへの302リダイレクトを発生させ、ユーザーがGETパラメーターとして要求した元の(エンコードされた)URLをリダイレクト場所ヘッダーに提供します。

ただし、GET変数のURLは、元のプロキシサーバーではなく、内部(セカンダリ)プロキシサーバーのURLです。したがって、「Location」応答ヘッダーを編集/書き換えて、正しいURLを指定したいと思います。

例えば。

  1. http://a.com/hello/ (元のリクエストされたURL)
  2. http://a.com/hello2/ (OpenSSOエージェントを使用したセカンダリプロキシ)
  3. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello2%2F (302でエンコードされた2番目のプロキシサーバーの要求されたURLを使用して認証サーバーにリダイレクトGET変数)
  4. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello%2F (エンコードされたURLは元のリクエストのURLに書き換えられます)

ヘッダーと書き換えのほとんどすべての組み合わせを運が悪かったので、それは不可能かもしれないと思っています。私が得た最も近いものはこれでしたが、mod_headers編集関数は環境変数を解析しません。

# On the primary proxy.
RewriteEngine On
RewriteRule ^/(.*)$ - [E=orig_request:$1,P]
Header edit Location ^(http://auth\.a\.com/login/\?orig_request=).*$ "$1http%3A%2F%2Fa.com%2F%{orig_request}e"
10
xeonman9000

ProxyPassReverse

ProxyPassReverse これを行う必要があります:

このディレクティブにより、ApacheはHTTPリダイレクト応答のLocation、Content-Location、およびURIヘッダーのURLを調整できます。

ProxyPassディレクティブとProxyPassReverseディレクティブのペアを使用して定義していると仮定すると、リバースプロキシがこのように動作していない理由がわかりません。

ロケーションヘッダーの編集

説明したとおりにLocationヘッダーを編集できるようにする場合は、それを行うことができます Apache 2.4.7以降

編集には、正規表現であるvalue引数と、追加の置換文字列の両方があります。バージョン2.4.7以降、置換文字列にはフォーマット指定子も含まれる場合があります。

ドキュメントに記載されている「フォーマット指定子」には、環境変数を使用できることが含まれます。 %{VAR}e

また、orig_request URLパラメーターが相対化されるようにアプリケーションを変更することを検討することもできます。これにより、環境変数を使用してヘッダーを編集する必要がなくなる可能性があります。

相対パス位置ヘッダー

Locationヘッダーで相対パスを使用することもできます。これにより、一方のドメインをもう一方のドメインに明示的にマッピングする必要がなくなります。これは公式に有効です RFC 7231現在 (2014年6月)、 しかしそれ以前から広くサポートされていました 。 Apache Header editディレクティブを使用してLocationヘッダーを相対化できます(環境変数の置換を必要としないため、バージョン2.4.7より前でも)。これは次のようになります。

Header edit Location "(^http[s]?://)([a-zA-Z0-9\.\-]+)(:\d+)?/" "/"
17
BrianV