繁体   English   中英

Windows IIS ARR 反向代理编码问题

[英]Windows IIS ARR Reverse Proxy Encoding Issue

We have an environment with an Windows 2019 Server IIS 10, which is acting as Reverse Proxy (ARR) for my IIS Server farm (Application Request Routing 3.0 and URL Rewrite 2.1). 我们在 HTTP 标头中发送用户名。 但是我的 ARR 以某种方式搞砸了编码(我们使用的是德语特殊字符,例如 ö、ü、ß...),所以当我检查 WebServer 的响应时,它向我显示:H%C3%B6lmuth M%C3%A4 %C3%9Fterm%C3%BCller 而不是 Hölmuth Mäßtermüller。

我有一个旧环境,Windows 2012R2 Server 配置相同,在这个环境下名字的显示是正确的。 我检查了新旧服务器之间的各种设置,但找不到任何区别。

此外,我使用了失败的请求日志和网络监视器来查看服务器接收和发送的内容,在下面找到结果。

收到关于 IIS ARR(旧的和新的)的请求:X-AUTHENTICATE-FamilyName:M%C3%A4%C3%9Fterm%C3%Bcller X-AUTHENTICATE-GivenName:H%C3%83%C2%B6lmuth X-AUTHENTICATE- cn: H%C3%B6lmuth M%C3%A4%C3%9Fterm%C3%Bller

请求发送到 IIS(新):X-AUTHENTICATE-FamilyName:M%C3%A4%C3%9Fterm%C3%BCller X-AUTHENTICATE-GivenName:H%C3%83%C2%B6lmuth X-AUTHENTICATE-cn:H %C3%B6lmuth M%C3%A4%C3%9Fterm%C3%Bller

请求发送至 IIS(旧):X-AUTHENTICATE-FamilyName:Mäßtermüller X-AUTHENTICATE-GivenName:Hölmuth X-AUTHENTICATE-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} 变量?

When an HTTP request arrives on Windows, the latest HTTP.sys encodes both URL and HTTP headers, and puts the original URL in UNENCODED_URL server variable so that it can be recovered afterwards.

但是,原始标题(例如X-AUTHENTICATE-FamilyName: Mäßtermüller )似乎没有被保留(没有明确的文档),因此没有任何简单的方法可以恢复它们。

如果要将 header 从X-AUTHENTICATE-FamilyName: M%C3%A4%C3%9Fterm%C3%BCllerX-AUTHENTICATE-FamilyName: Mäßtermüller ,我能想到的唯一方法是编写自定义IIS 模块执行解码步骤。

或者,您可以修改您的其他代码以接受此类编码的 header 值(并在您的代码中需要时对其进行解码),因为无论如何这就是 Windows/IIS 现在的行为方式,您无法与之抗争。

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

To set the flag to go IIS Manager then select Configuration Editor and go to the section system.webServer/rewrite/rules , where you will find the useOriginalURLEncoding flag.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM