2014-03-04 51 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