web-dev-qa-db-ja.com

IIS10 URL Rewrite 2.1ダブルエンコーディングの問題

ARR 3.0を備えたIIS10サーバーと、他のいくつかのWebサーバーのリバースプロキシとして機能するURL書き換えモジュール2.1があります。他のサーバーは異なるポートで実行されるため、IIS10サーバーはポート80で「フレンドリURL」を提供します。URL書き換えは、要求をバックエンドサーバーに渡すために使用されます。

そのようなサーバーの1つは Jenkins です。

Jenkinsには、リバースプロキシが適切に構成されているかどうかを通知する警告メッセージ( 詳細はこちら )があり、この警告メッセージはリバースプロキシの問題を見つけるのに役立ちました。

問題は、URL書き換えが私のURLをデコードおよびエンコードすることです。これは、URLがJenkinsに到達するまでに、ブラウザーが要求したものとは異なるということです。

例:

URL書き換えルール:

<rule name="Jenkins Rewrite" stopProcessing="true">
   <match url="(.*)" />
   <conditions>
     <add input="{HTTP_Host}" pattern=".*jenkins.mydomain.*" />
     <add input="{HTTPS}" pattern="on" />
   </conditions>
   <action type="Rewrite" url="http://localhost:8080/{R:1}" appendQueryString="true" />
   <serverVariables>
     <set name="HTTP_X_FORWARDED_Host" value="{HTTP_Host}" />
     <set name="HTTP_X_FORWARDED_SCHEMA" value="https" />
     <set name="HTTP_X_FORWARDED_PROTO" value="https" />
   </serverVariables>
 </rule>

以下のURLを送信する場合:

https://jenkins.mydomain/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

ルールをトリガーする前にエンコードされた文字がデコードされることに気づき、{R:1}は次のようになります:/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https:/jenkins.mydomain/manage/

いくつかの調査の結果、{R:1}の代わりに{UNENCODED_URL}を使用してリクエスト文字列を取得できることがわかりましたデコードなので、ルールのアクションを調整しました:

<action type="Rewrite" url="http://localhost:8080{UNENCODED_URL}" appendQueryString="false" />

残念ながら、URL Rewriteは私のRewriteの後でURLを再度エンコードしているため、Jenkinsが受け取ったURLは二重にエンコードされています。

/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%253A%252F%252Fjenkins.mydomain%252Fmanage%253F

短い要約:

このURLを見ると:/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

私たちが持っているのは:/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/<parameter1>

ここで、<parameter1> = https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

<parameter1>のスラッシュ文字は、Jenkinsがpathの一部と<parameter1>の一部を認識できるようにエンコードされています。

つまり、URL RewriteがURLをデコードすると、<parameter1>が残りのpathと混合されます。

望ましい結果は、ブラウザーが送信したとおりにURLを取得することですが、localhostをポイントしています。

http://localhost:8080/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

とにかく、URL書き換えモジュールが実行しているこのデコード/エンコード操作を無効にする方法はありますか?

PS:私は ブログ投稿 をURL書き換えv2.1機能に関して見つけました、そしてそれはこの動作を無効にするために使用できる新しいフラグがあると言います、しかし私はどのようにまたはどこでするかについての手がかりがありませんそれを設定します。

V7.1.1980より前のバージョンのURL書き換えでは、UNENCODED_URLを使用しようとすると、URL書き換えによりエンコードされ、元のURLがすでにエンコードされている場合、二重エンコードにつながる可能性があります。これは、RFC3986のセクション2.4に違反しています。同じ文字列を複数回パーセントエンコードまたはデコードしないでください。すでにデコードされた文字列をデコードすると、パーセントデータオクテットがパーセントエンコードの開始と誤解される可能性があり、すでにパーセントエンコードされている場合はその逆です。エンコードされた文字列。」また、特にバックエンドサーバーがURLが変更されずに渡されることを期待するARRを使用するリバースフォワーダーのシナリオで、UNENCODED_URLの使用を非現実的にしました。

V7.1.1980では、機能フラグuseOriginalURLEncodingを追加します。これにより、trueに設定すると、この非準拠のURLエンコーディングをオフにできます。デフォルトの動作は変更されません(useOriginalURLEncodingはデフォルトでtrueです)。

ここの誰かがそれを行う方法について何か考えを持っていますか?

3
Jorge Martins

質問で参照した投稿に記載されているuseOriginalURLEncoding = falseを設定することで、なんとか問題を解決できました。

フラグをIIS Managerに設定するには、次にConfiguration Editorを選択し、system.webServer/rewrite/rulesセクションに移動します。ここにuseOriginalURLEncodingフラグがあります。

フラグをfalseに設定すると、ルールで{UNENCODED_URL}変数を使用するときにURL書き換えでURLがエンコードされなくなります。

1
Jorge Martins