6

IIS 7.5、Application Request Routing 3.0 (ARR)、およびURL Rewrite 2.0を使用してJenkinsのリバース プロキシを設定しようとしています。

プロキシはほとんど機能していますが、パーセント記号 (%) を含む URL で問題が発生しています。

私が何をしようとしても、プロキシは、書き換えられた URL のパーセント記号を逆エンコードまたは再エンコードすることを要求します。

これは、URL を書き換える方法です。

http://my.proxy/a%2Fb -> http://my.host:8080/a%2Fb

これは、URL が実際に書き換えられている方法です。

http://my.proxy/a%2Fb -> http://my.host:8080/a/b
- or -
http://my.proxy/a%2Fb -> http://my.host:8080/a%252Fb

IIS\ARR\Rewrite を取得して、書き換えた URL の再エンコードを停止するにはどうすればよいですか?

私が試したこと:

  1. 通常のリバース プロキシ (URL を のように書き換えますhttp://my.host:8080/a/b):

    <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" ignoreCase="true" /> <action type="Rewrite" url="http://my.host:8080/{R:1}" /> </rule>

  2. サーバー変数を使用するUNENCODED_URL(URL を に書き換えますhttp://my.host:8080/a%252Fb):

    <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" ignoreCase="false" /> <conditions logicalGrouping="MatchAll"> <add input="{UNENCODED_URL}" pattern="/(.*)" /> </conditions> <action type="Rewrite" url="http://my.host:8080/{C:1}" /> </rule>

  3. URL を直接入力するだけです (テストとして - URL を のように書き換えますhttp://my.host:8080/a%252Fb):

    <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" ignoreCase="false" /> <action type="Rewrite" url="http://my.host:8080/a%2Fb" /> </rule>

  4. Scott Hanselman の優れた「風変わりな実験: ASP.NET/IIS 要求 URL でパーセント、山かっこ、およびその他のいたずらを許可する」のすべてのアイデア

    1. <httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="*,:,&amp;,\" relaxedUrlToFileSystemMapping="true" />
    2. <security> <requestFiltering allowDoubleEscaping="true" /> </security>'

注: IIS リバース プロキシが、この形式の URL への HTTP リダイレクトを実行しようとするJenkins の組み込みリバース プロキシ チェック システムに違反したときに、この動作に遭遇しました。

4

3 に答える 3

2

ジョセフ、これは、まったく同じ問題を解決しようとしたすべての方法の優れた要約であり、IIS でトラフィックを Gerrit インスタンスにルーティングする SSL を使用しています。あなたの投稿を見つけたとき、誰かがそれを構成する魔法の方法を考え出したのではないかと思いましたが、それは不可能だと思います. もう1つ試してみました.IIS用のカスタム書き換えプロバイダを作成して、ルーティングが完了する前にパーセント記号をデコードできるようにしましたが、エンコードが後で行われ、これは無意味であることに気付きました(あなたのステップを忘れていました) nr 3 は非常に良好であることを示しています)。

しかし、IIS を取り除くことはできなかったので、回避策を見つけました。IIS と Gerrit の間で追加のプロキシとして機能する単純なサービスを実装しました。手順 2 のように IIS を構成すると、転送される要求が%25URL のパーセント文字の代わりに取得されます。IIS は、Gerrit に到達する代わりに、要求をプロキシ サービスに転送します。このサービスは、出現するすべての%25to を変更し%(パーセントをデコード)、それを Gerrit に転送します。応答に対して何もする必要はありません。この方法を使用したい場合は、C# でのプロキシの簡単な実装から始めることができます。

https://gist.github.com/gralin/b5edfd908a41fc7268a7757698af1e66

于 2016-04-25T19:41:38.510 に答える
0

URL に % 記号が含まれているプロキシを使用すると問題があると考えていましたが、その後、そうではないことがわかりました。プロキシ URL が長すぎる問題。

オプション server-side: true および type: GET で datatable を使用します。次に、プロキシ URL が長すぎるサーバーからコンテンツをロードすると、問題が発生します。URL リクエストのサイズを改善し、問題を修正しました。

<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxQueryString="4000" maxUrl="2000" />
        </requestFiltering>
    </security>
    <rewrite>...</rewrite>
    ...
</system.webServer>

ただし、長いクエリ文字列と URL を許可することはセキュリティ上のリスクであり、さらに悪い設計であることに注意してください。

于 2016-02-02T05:36:48.010 に答える