IIS10 URL Rewrite 2.1 双重编码问题

IIS10 URL Rewrite 2.1 双重编码问题

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

其中一个服务器是詹金斯

Jenkins 有一个警告消息,告诉您反向代理是否配置正确(更多详细信息请点击此处),这个警告消息帮助我发现了反向代理中的问题。

问题在于 URL Rewrite 对我的 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/

经过一番研究,我发现我可以使用{未编码的网址}代替{回复:1}获取解码之前的请求字符串,因此我调整了我的规则操作:

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

不幸的是,URL 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 重写模块正在执行的解码/编码操作?

附言:我发现了一个博客文章关于 URL Rewrite v2.1 功能,它说有一个新的标志可用于禁用此行为,但我不知道如何或在哪里设置它。

在 v7.1.1980 之前的 URL 重写版本中,当尝试使用 UNENCODED_URL 时,URL 重写将对其进行编码,如果原始 URL 已经编码,则可能导致双重编码。这违反了 RFC3986 第 2.4 节,该节规定“实现不得对同一字符串进行多次百分比编码或解码,因为解码已解码的字符串可能会导致将百分比数据八位字节误解为百分比编码的开头,或者在对已百分比编码的字符串进行百分比编码的情况下反之亦然。”这也使得 UNENCODED_URL 的使用不切实际,尤其是在具有 ARR 的反向转发器场景中,其中后端服务器期望 URL 不加修改地传递。

在 v7.1.1980 中,我们添加了一个功能标记 useOriginalURLEncoding,当设置为 true 时,您可以关闭此不合规的 URL 编码。默认行为将保持不变(useOriginalURLEncoding 默认为 true)。

这里有人知道该怎么做吗?

答案1

useOriginalURLEncoding = false我设法通过问题中引用的帖子中描述的设置来解决该问题。

要设置标志,请IIS Manager选择Configuration Editor并转到该部分system.webServer/rewrite/rules,您将在那里找到该useOriginalURLEncoding标志。

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

相关内容