IIS10 URL重写2.1双重编码问题
我有一台IIS10服务器,它带有arr3.0和URL重写模块2.1,充当其他几个web服务器的反向代理。其他服务器在不同的端口上运行,因此IIS10服务器在端口80上提供“友好URL”。URL重写用于将请求转交给后端服务器 一个这样的服务器是 Jenkins有一条警告消息,告诉您反向代理是否配置良好(),这条警告消息帮助我在反向代理中发现了一个问题 问题是,URL重写是对我的URL进行解码和编码,当它们到达Jenkins时,它们与浏览器要求的内容不同 示例: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
<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。我刚刚用这些信息更新了问题。你应该得到一尊雕像!我已经为这个问题寻找了几个小时的解决方案。非常感谢你!