Windows IIS ARR反向代理编码问题



我们有一个Windows 2019服务器IIS 10的环境,它作为我的IIS服务器场的反向代理(ARR)(应用程序请求路由3.0和URL重写2.1)。我们在HTTP头中发送用户名。但是我的ARR不知怎么搞砸了编码(我们使用德语特殊字符,例如ö,ü,ß…),所以当我检查WebServer的响应时,它显示给我:H%C3%B6lmuth M%C3%A4%C3%9Fterm%C3%BCller而不是Hölmuth Mäßtermüller。

我有一个旧的环境与Windows 2012R2服务器具有相同的配置,在这个环境中显示的名称是正确的。我已经检查了新旧服务器之间的各种设置,但没有发现任何差异。

进一步,我使用了失败的请求登录和网络监视器来查看服务器接收和发送的内容,下面找到结果。

收到的IIS ARR请求(旧的和新的):X-AUTHENTICATE-FamilyName: M % C3%A4%C3 % 9 fterm % C3%Bcllerc2%b6lmuth X-AUTHENTICATE-GivenName: H % C3 % 83%X-AUTHENTICATE-cn: H% c3% b6muth M%C3%A4%C3%9Fterm%C3%BCller

请求发送到IIS(新):X-AUTHENTICATE-FamilyName: M % C3%A4%C3 % 9 fterm % C3%BCllerc2%b6lmuth X-AUTHENTICATE-GivenName: H % C3 % 83%X-AUTHENTICATE-cn: H% c3% b6muth M%C3%A4%C3%9Fterm%C3%BCller

请求发送到IIS(旧):X-AUTHENTICATE-FamilyName:马ßtermullerX-AUTHENTICATE-GivenName:哈¶lmuthx - authentication -cn: Hölmuth Mäßtermüller

有人知道如何改变这种行为吗?非常感谢你的帮助。

你能给我一个例子如何使用{UNENCODED_URL}变量吗?目前,我们正在使用重写模块将请求路由到特定的服务器场,请参阅下面的规则:

<rewrite>
<globalRules useOriginalURLEncoding="true">
<rule name="ARR_BPBP-DEV_loadbalance" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<action type="Rewrite" url="http://BPBP-DEV/{R:0}" />
<conditions>
<add input="{HTTP_HOST}" pattern="bmi-bpbp-dev.vecos.at" />
</conditions>
</rule>
<rule name="ARR_BPBP-TEST_loadbalance" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<action type="Rewrite" url="http://BPBP-TEST/{R:0}" />
<conditions>
<add input="{HTTP_HOST}" pattern="bmi-bpbp-test.vecos.at" />
</conditions>
<serverVariables>
</serverVariables>
</rule>
</globalRules>

我如何适应规则使用{UNENCODED_URL}变量?

当一个HTTP请求到达Windows时,最新的HTTP。sys对URL和HTTP头进行编码,并将原始URL放在UNENCODED_URL服务器变量中,以便以后可以恢复。

然而,原始的头文件(如X-AUTHENTICATE-FamilyName: Mäßtermüller)似乎没有被保留(没有明确的文档),所以没有任何简单的方法来恢复它们。

如果你想修改标题从X-AUTHENTICATE-FamilyName: M%C3%A4%C3%9Fterm%C3%BCller回到X-AUTHENTICATE-FamilyName: Mäßtermüller,我能想到的唯一方法是编写一个自定义IIS模块来执行解码步骤。

或者,你可以修改你的其他代码来接受这样的编码头值(并在你的代码需要时解码它们),无论如何,这就是Windows/IIS现在的行为,你不能对抗它。

尝试将useOriginalURLEncoding设置为false,当在规则中使用{UNENCODED_URL}变量时,URL重写将不再编码URL。

要将标志设置为IIS管理器,请选择Configuration Editor,然后转到system.webServer/rewrite/rules部分,在那里您将找到useOriginalURLEncoding标志。

最新更新