2014-03-04 37 views
4

我正在尝试使用IIS 7.5,0.3.0(ARR)和URL Rewrite 2.0为Jenkins设置反向代理。包含百分号(%)的IIS反向代理重新编码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 

我怎样才能获得IIS \ ARR \重写停止重新编码我重写的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. 所有的想法斯科特Hanselman的优秀 “Experiments in Wackiness: Allowing percents, angle-brackets, and other naughty things in the ASP.NET/IIS Request URL

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

注:我就遇到了这个问题,当我的IIS反向代理相抵触的Jenkins' built-in reverse proxy checking system它试图做一个HTTP重定向到这种形式的URL跑去。

+0

你有没有想出解决办法?我现在有同样的问题... – Korijn

+0

不幸的是,没有。出于这个原因,我已经不再考虑将IIS作为可接受的反向代理平台。 –

+0

你用什么来代替? – Martin

回答

0

我以为使用代理与URL包含%符号有问题,但之后,我已经发现它不是。代理网址太长的问题。

我使用datatable选项服务器端:true并键入:GET。然后,当使用代理网址从服务器加载内容太长时,出现问题。我已经改进了url请求的大小,问题已得到解决。

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

但请记住,允许长查询字符串和URL是安全风险,更重要的是,这是一个糟糕的设计。

2

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

我不能像摆脱IIS一样摆脱IIS,所以我想出了一个解决方法。我已经实现了一个简单的服务,充当IIS和Gerrit之间的附加代理。当您像步骤2中一样配置IIS时,转发的请求将获得%25以代替url中的百分比字符。 IIS不会到达Gerrit,而是将请求转发给代理服务。该服务将所有出现的%25更改为%(解码百分比)并将其转发给Gerrit。回应不需要做任何事情。对于那些谁想要走这条路,你可以从我的简单实现代理的在C#中开始:

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