IIS 没有设置 X-FORWARDED-HOST

IIS 没有设置 X-FORWARDED-HOST

我有一台 IIS 服务器 [在 WinServer 2016 上],它充当一些 Kestrel Web 服务器的反向代理。现在,我正在尝试设置 IIS 以转发所有 X-Forwarded-* 标头。对于 X-Forwarded-For 和 X-Forwarded-Proto 标头,一切正常,但对于 X-Forwarded-Host 则不然。

这是服务器级别的“允许的服务器变量”:

允许的服务器变量

当 HTTP 请求到达 Kestrel Web 服务器时,我在调试器中看到的内容如下

HTTP 标头

不幸的是,我无法从 PROD 服务器创建转储,但由于一些功能无法正常工作,情况应该类似于 DEV 环境。

在阅读了几篇关于如何将 IIS 设置为反向代理的文章后,我感觉所有 X-Forwarded-* 标头都应该自动添加。或者,XFH 是个例外,我需要手动设置它?

如能得到任何帮助我将非常感激!

答案1

我最终从 GitHub 问题中找到了答案。我尝试同时设置两者X-Forwarded-HostHost标头,但都无法正常工作:

https://github.com/maptiler/tileserver-gl/issues/119

在 IIS 中解决此问题的一种方法是强制 IIS 不更改主机头。

\Windows\System32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost

您也可以从 UI 执行此操作:

将 system.webServer/proxy retainHostHeader 设置为 True

当我设置它并重新启动服务器后,变量就被正确设置了,并且我反向代理的 Flask 应用程序重定向到正确的 URL(而不是localhost:8050)。

希望这对某些人有帮助。我花了无数个小时才让它发挥作用。

答案2

我花了一段时间才弄清楚。IIS 处理其服务器变量的方式有些奇怪,如下所示:

  1. 您必须在 InetMgr GUI 中定义该变量,我发现尝试仅使用 web.config 指定,服务器将返回 500 个内部服务器错误,直到添加该变量。(您已经完成此操作,因此这里无需更改。)

  2. 必须为请求分配一个动态值或为每个请求分配一个静态值。这在 web.config 中执行:

带标记和语法高亮的代码

如果您想复制并粘贴:

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http:/example.com/{R:1}" />
                    <serverVariables>
                        <set name="ORIGINAL_HOST20" value="{HTTP_HOST}" />
                        <set name="HTTP_X_FORWARDED_PROTO" value="https" />
                        <set name="HTTP_X_FORWARDED_PORT" value="443" />
                        <set name="HTTP_X_FORWARDED_HOST" value="example.com" />
                    </serverVariables>
                </rule>
            </rules>
    </rewrite>
    <httpErrors errorMode="DetailedLocalOnly" />
    <directoryBrowse enabled="false" />
</system.webServer>

希望这可以帮助!

相关内容