6

我正在尝试使用 IIS 7.5、应用程序请求路由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 反向代理与Jenkins 的内置反向代理检查系统发生冲突时,我遇到了这种行为,该系统试图将 HTTP 重定向到此表单的 URL。

4

3 回答 3

2

约瑟夫,这是我尝试解决完全相同问题的所有方法的一个很好的总结,让带有 SSL 的 IIS 将流量路由到我的 Gerrit 实例。当我找到你的帖子时,我希望也许有人想出了一种神奇的方式来配置它,但我想这是不可能的。我又尝试了一件事,我为 IIS 编写了一个自定义重写提供程序,这样我就可以在路由完成之前对百分号进行解码,但后来我意识到编码发生在以后,这是毫无意义的(我忘记了你的步骤nr 3 表明它非常好)。

但是我不能像以前那样摆脱 IIS,所以我想出了一个解决方法。我已经实现了一个简单的服务,它充当 IIS 和 Gerrit 之间的附加代理。当您像在第 2 步中那样配置 IIS 时,转发的请求将%25代替 url 中的百分比字符。IIS 没有到达 Gerrit,而是将请求转发到代理服务。该服务更改所有出现的%25to %(解码百分比)并将其转发给 Gerrit。无需对响应进行任何操作。对于那些想要这样做的人,您可以从我在 C# 中简单实现代理开始:

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

于 2016-04-25T19:41:38.510 回答
1

我能够使用第二种方法和设置解决此问题useOriginalURLEncoding="false"

<rules useOriginalURLEncoding="false">
    <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>
</rules>

有关背景信息,另请参阅官方博客文章。的措辞useOriginalURLEncoding有点不幸。

于 2019-01-23T17:53:17.263 回答
0

我曾认为使用带有 url 的代理包含 % 符号有问题,但之后我发现它不是。代理 URL 太长的问题。

我使用带有选项服务器端的数据表:true 并输入:GET。然后,当从服务器加载内容时,代理 url 太长,就会出现问题。我已经改进了 url 请求的大小并且问题已得到解决。

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

但请记住,允许长查询字符串和 url 存在安全风险,此外,这是一个糟糕的设计。

于 2016-02-02T05:36:48.010 回答