IIS反向代理重新编码包含百分号的URL(%)

IIS反向代理重新编码包含百分号的URL(%),iis,urlencode,reverse-proxy,url-rewrite-module,arr,Iis,Urlencode,Reverse Proxy,Url Rewrite Module,Arr,我正在尝试为使用IIS 7.5、3.0(ARR)和2.0设置反向代理 我的代理基本上正常工作,但在包含百分比符号(%)的URL中遇到问题 不管我怎么做,代理都坚持对重写URL中的百分号进行反编码或重新编码 这就是我希望URL重写的方式: http://my.proxy/a%2Fb -> http://my.host:8080/a%2Fb http://my.proxy/a%2Fb -> http://my.host:8080/a/b - or - http://my.proxy/a

我正在尝试为使用IIS 7.5、3.0(ARR)和2.0设置反向代理

我的代理基本上正常工作,但在包含百分比符号(%)的URL中遇到问题

不管我怎么做,代理都坚持对重写URL中的百分号进行反编码或重新编码

这就是我希望URL重写的方式:

http://my.proxy/a%2Fb -> http://my.host:8080/a%2Fb
http://my.proxy/a%2Fb -> http://my.host:8080/a/b
- or -
http://my.proxy/a%2Fb -> http://my.host:8080/a%252Fb
这就是URL实际被重写的方式:

http://my.proxy/a%2Fb -> http://my.host:8080/a%2Fb
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重新编码

我尝试过的事情:

http://my.proxy/a%2Fb -> http://my.host:8080/a%2Fb
http://my.proxy/a%2Fb -> http://my.host:8080/a/b
- or -
http://my.proxy/a%2Fb -> http://my.host:8080/a%252Fb
  • 普通反向代理(将URL重写为
    http://my.host:8080/a/b
    ):

    
    "


  • 注意:当我的IIS反向代理与尝试将HTTP重定向到此表单的URL的代理发生冲突时,我遇到了此行为。

    我认为使用URL包含%symbol的代理会有问题,但之后我发现不是。问题是代理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存在安全风险,而且,这是一个糟糕的设计。

    Joseph,这是我试图解决完全相同问题的所有方法的一个很好的总结,让IIS通过SSL将流量路由到我的Gerrit实例。当我找到你的帖子时,我希望可能有人想出一种神奇的方法来解决这个问题我还试过一件事,我已经为IIS编写了一个自定义重写提供程序,这样我就可以在路由完成之前取消对百分号的编码,但后来我意识到编码是在以后进行的,这是毫无意义的(我忘记了你的步骤nr 3,它显示得非常好)

    然而,我无法像我们一样摆脱IIS,因此我找到了一个解决办法。我实现了一个简单的服务,作为IIS和Gerrit之间的附加代理。当您像在步骤2中一样配置IIS时,转发的请求将得到
    %25
    而不是URL中的百分比字符。IIS转发不是到达Gerrits对代理服务的请求。该服务将所有出现的
    %25
    更改为
    %
    (解码百分比),并将其转发给Gerrit。无需对响应执行任何操作。对于那些想这样做的人,您可以从我在C#中对代理的简单实现开始:


    我能够使用第二种方法解决此问题,并设置
    useOriginalurEncode=“false”

    
    
    作为背景信息。
    UseOriginalurEncoding
    的措辞有点令人遗憾。

    你有没有发现这个问题?我现在也有同样的问题……不幸的是,没有。出于这个原因,我不再考虑将IIS作为一个可接受的反向代理平台。你使用了什么?@Martin-我一直使用Apache.我试图在Windows设备上切换到IIS,但没有成功。