IIS 没有设置 X-FORWARDED-HOST

Vol*_*kyy 8 iis reverse-proxy

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

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

允许的服务器变量

这是我在调试器中看到的,当 HTTP 请求命中 Kestrel 网络服务器时

HTTP 标头

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

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

我将不胜感激任何形式的帮助!

小智 6

我终于从 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
Run Code Online (Sandbox Code Playgroud)

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

将 system.webServer/proxypreserveHostHeader 设置为 True

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

希望这对某人有帮助。我花了无数的时间试图让它发挥作用。


小智 5

这花了我一段时间才弄清楚。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>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!