IIS10 URL重写2.1双重编码问题

我有一个IIS10服务器与ARR 3.0和URL重写模块2.1充当其他几个Web服务器的反向代理。 其他服务器运行在不同的端口上,因此IIS10服务器在端口80上提供“友好的URL”。URL重写用于将请求交给后端服务器。

一个这样的服务器是jenkins

Jenkins有一个警告消息,告诉您反向代理是否configuration正确( 更多细节在这里 ),这个警告消息帮助我在反向代理中发现问题。

问题是,url重写是解码和编码我的url,当他们到达jenkins时,他们是不同的浏览器要求。

例:

URL重写规则:

<rule name="Jenkins Rewrite" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern=".*jenkins.mydomain.*" /> <add input="{HTTPS}" pattern="on" /> </conditions> <action type="Rewrite" url="http://localhost:8080/{R:1}" appendQueryString="true" /> <serverVariables> <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" /> <set name="HTTP_X_FORWARDED_SCHEMA" value="https" /> <set name="HTTP_X_FORWARDED_PROTO" value="https" /> </serverVariables> </rule> 

发送以下URL时:

HTTPS://jenkins.mydomain/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

我注意到在触发规则之前解码的编码字符,使得{R:1}看起来像这样: /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https:/jenkins.mydomain/manage/ : /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https:/jenkins.mydomain/manage/

经过一番研究,我发现我可以在解码之前使用{UNENCODED_URL}而不是{R:1}来获取请求string,所以我调整了我的规则动作:

<action type="Rewrite" url="http://localhost:8080{UNENCODED_URL}" appendQueryString="false" />

不幸的是,URL Rewrite在我的Rewrite之后再次对URL进行编码,使Jenkins得到双倍编码的URL:

/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%253A%252F%252Fjenkins.mydomain%252Fmanage%253F

简短的摘要:

当你看这个url: /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

我们有什么是: /administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/<parameter1>

其中<parameter1> = https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

<parameter1>中的斜线字符被编码,以便Jenkins可以知道什么是path一部分,什么是<parameter1>

这意味着,当URL重写解码URL时, <parameter1>会与其余的path混合在一起。

所需的结果是获取URL完全按照浏览器发送,但指向本地主机:

http://localhost:8080/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/testForReverseProxySetup/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F

反正有禁用这个URL重写模块正在做的解码/编码操作?

PS:我发现了一篇关于URL Rewrite v2.1function的博客文章 ,并且说有一个新的标志可以用来禁用这个行为,但我不知道如何或在哪里设置它。

在V7.1.1980之前的URL Rewrite版本中,当试图使用UNENCODED_URL时,URL Rewrite将对其进行编码,如果原始URL已经被编码,则可能导致双重编码。这违反了RFC3986的第2.4节,其中规定了“实现必须不是百分比 – 不止一次地编码或解码相同的string,因为解码已经解码的string可能导致错误地解释百分比数据八位组作为百分比编码的开始,反之亦然百分比编码已经百分比的编码 – 编码的string“。 它还使得UNENCODED_URL的使用变得不切实际,特别是在ARR的反向转发器场景中,后端服务器期望URL不被修改地传递。

在v7.1.1980中,我们添加了一个function标志useOriginalURLEncoding,允许您在设置为true时closures此不符合的URL编码。 默认行为将保持不变(useOriginalURLEncoding默认为true)。

有没有人有任何想法如何做到这一点?

我设法解决这个问题,通过设置useOriginalURLEncoding = false在问题中引用的post中描述。

要设置标志去IIS Manager然后selectConfiguration Editor并转到部分system.webServer/rewrite/rules ,在那里你会发现useOriginalURLEncoding标志。

将标志设置为false,在规则中使用{UNENCODED_URL}variables时,URL重写将不再对URL进行编码。