web-dev-qa-db-ja.com

URL書き換えは、リバースプロキシ301がリダイレクトするときに元のホストの場所を保持します

IIS 7.5サイト: http://site1.com/ でURL書き換えを設定しています

これは、2番目のサイトへのリバースプロキシとして機能します: http://site2.com/

イベントの流れは次のとおりです。
1。ブラウザはでGETを実行します http://site1.com/somepath
2。 site1はURL書き換えリバースプロキシであるため、これはsite2に渡されます。これはうまく機能し、これを必要とするmodを実行したため、ホストは正しく設定されています。
3。 site2は301ステータスで応答し、HTTPロケーションヘッダーを http://site3.com/somenewpath に設定します。
4。 site1はブラウザに301で応答しますが、LocationヘッダーのHostをsite1に置き換えます: http://site1.com/somenewpath

手順4で実行したいのは、site1がHTTP Locationヘッダーで http://site3.com/somenewpath で応答し、このデータを直接パススルーすることです。これを解決するために適用できるアウトバウンドルールが必要だと思いますが、まだそれを理解することができていません。

16
Guy

アプリケーションリクエストルーティング が関与する可能性がありますか? IIS->マシンまたはサイト->アプリケーション要求ルーティングキャッシュ->サーバープロキシ設定]を確認し、[応答ヘッダーの逆書き換えホスト]チェックボックスをオフにします。これをマシンレベルで行う場合は、すべてのサイトで有効になります。特定のサイトで実行した場合、そのサイトでのみ有効になり、ボックス上の他のサイトは影響を受けません。

32
robrich

上記のコメントで述べたように、リバースプロキシのデフォルトの動作は、応答をそのまま通過させることだと思います(アウトバウンドリライトルールが設定されていないことを前提としています)。ただし、プロキシの背後にあるサーバーからの301応答を使用して、シナリオを具体的にテストしていません。

特別なアウトバウンドルールが実際に必要な場合、このコードはすべての301応答のHTTPロケーションヘッダーを http://site3.com/somepath に変更します。

<outboundRules>
  <!-- This rule changes the domain in the HTTP location header for redirect responses -->
  <rule name="Change Location Header">
    <match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
    <conditions>
      <add input="{RESPONSE_STATUS}" pattern="^301" />
    </conditions>
    <action type="Rewrite" value="http://www.site3.com/{R:1}" />
  </rule>
</outboundRules>

このルールは、 RL Rewrite Module 2.0 Configuration Reference に投稿されたルールを少し変更したものです。

6
Woodchipper