我有一台 IIS 服务器 [在 WinServer 2016 上],它充当一些 Kestrel Web 服务器的反向代理。现在,我正在尝试设置 IIS 以转发所有 X-Forwarded-* 标头。对于 X-Forwarded-For 和 X-Forwarded-Proto 标头,一切正常,但对于 X-Forwarded-Host 则不然。
这是服务器级别的“允许的服务器变量”:
当 HTTP 请求到达 Kestrel Web 服务器时,我在调试器中看到的内容如下
不幸的是,我无法从 PROD 服务器创建转储,但由于一些功能无法正常工作,情况应该类似于 DEV 环境。
在阅读了几篇关于如何将 IIS 设置为反向代理的文章后,我感觉所有 X-Forwarded-* 标头都应该自动添加。或者,XFH 是个例外,我需要手动设置它?
如能得到任何帮助我将非常感激!
答案1
我最终从 GitHub 问题中找到了答案。我尝试同时设置两者X-Forwarded-Host
和Host
标头,但都无法正常工作:
从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 处理其服务器变量的方式有些奇怪,如下所示:
您必须在 InetMgr GUI 中定义该变量,我发现尝试仅使用 web.config 指定,服务器将返回 500 个内部服务器错误,直到添加该变量。(您已经完成此操作,因此这里无需更改。)
必须为请求分配一个动态值或为每个请求分配一个静态值。这在 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>
希望这可以帮助!