IIS10 URL重写2.1双重编码问题

IIS10 URL重写2.1双重编码问题,iis,url-rewriting,reverse-proxy,url-rewrite-module,iis-10,Iis,Url Rewriting,Reverse Proxy,Url Rewrite Module,Iis 10,我有一台IIS10服务器,它带有arr3.0和URL重写模块2.1,充当其他几个web服务器的反向代理。其他服务器在不同的端口上运行,因此IIS10服务器在端口80上提供“友好URL”。URL重写用于将请求转交给后端服务器 一个这样的服务器是 Jenkins有一条警告消息,告诉您反向代理是否配置良好(),这条警告消息帮助我在反向代理中发现了一个问题 问题是,URL重写是对我的URL进行解码和编码,当它们到达Jenkins时,它们与浏览器要求的内容不同 示例: <rule name="Jen

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

一个这样的服务器是

Jenkins有一条警告消息,告诉您反向代理是否配置良好(),这条警告消息帮助我在反向代理中发现了一个问题

问题是,URL重写是对我的URL进行解码和编码,当它们到达Jenkins时,它们与浏览器要求的内容不同

示例:

<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重写规则:

<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>

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

经过一些研究,我发现我可以使用{UNENCODED_URL}而不是{R:1}在解码之前获取请求字符串,因此我调整了规则操作:

关于URL Rewrite v2.1的功能,它说有一个新的标志可以用来禁用这种行为,但我不知道如何或在哪里设置它

在v7.1.1980之前的URL重写版本中,当尝试使用 未编码的URL,URL重写将对其进行编码,这可能导致双重 编码如果原始URL已编码,则这是违反规则的 RFC3986第2.4节,其中规定“实施不得 与解码一样,对同一字符串进行多次编码或解码的百分比 已解码的字符串可能会导致错误解释百分比数据 八位字节作为百分比编码的开始,或在 百分数编码的情况已经百分数编码的字符串。”它也 使未编码URL的使用变得不切实际,尤其是在相反的情况下 具有ARR的转发器场景,其中后端服务器期望URL 未经修改而通过

在v7.1.1980中,我们添加了一个特性标志UseOriginalurEncode 这允许您在设置时关闭此不兼容的URL编码 这是真的。默认行为将保持不变 (默认情况下,UseOriginalurEncoding为true)


这里有人知道怎么做吗?

您可以使用
UrlEncode
功能实现这一点。将规则更改为:

<action type="Rewrite" url="http://localhost:8080/{UrlEncode:{R:1}}" appendQueryString="true" />

更新: 另一种解决问题的方法

<rule name="Jenkins Rewrite" stopProcessing="true">
   <match url="(.*)" />
   <conditions>
        <add input="{UNENCODED_URL}" pattern="(.*)" />
         <add input="{HTTP_HOST}" pattern=".*jenkins.mydomain.*" />
         <add input="{HTTPS}" pattern="on" />
    </conditions>
    <action type="Rewrite" url="http://localhost:8080{C: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>

我在问题中引用的帖子中描述了设置
UseOriginalurEncode=false,从而解决了这个问题

要将标志设置为转到
IIS管理器
,请选择
配置编辑器
,然后转到
system.webServer/rewrite/rules
部分,在那里可以找到
UseOriginalurEncoding
标志


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

它不起作用,因为以前编码的斜杠字符将不会被编码。如果仔细查看请求url,您会注意到最后一条是:
/https%3A%2F%2Fjenkins.mydomain%2Fmanage%3F
其中:
%2F=/
嗯,我找不到任何区别。请尝试将
Rewrite
word更改为
Redirect
,并将结果与
/
进行比较。Redirect的问题与以前相同。我编辑了这个问题。真正的问题是编码的斜杠字符属于一个参数,而不是Jenkins中的一个页面。好的,也许在您的问题中包含预期的结果也更好。您想要实现的目标是获得与浏览器发送的URL完全相同的URL,但指向localhost:8080。我刚刚用这些信息更新了问题。你应该得到一尊雕像!我已经为这个问题寻找了几个小时的解决方案。非常感谢你!