IIS {SERVER_NAME} 不返回主机名

IIS {SERVER_NAME} not returning hostname

提问人:Hoshi 提问时间:11/8/2023 最后编辑:Hoshi 更新时间:11/15/2023 访问量:66

问:

使用 IIS“Server 2016”v10.0.14393.0,我有一个 web.config URLRewrite 规则,用于将入站连接重定向到处理它们的 NodeJS 应用程序:

<rule name="WebSocket" enabled="true" stopProcessing="true">
  <match url="wsapp/(.*)" />
  <action type="Redirect" url="https://{SERVER_NAME}:7899/{R:1}" redirectType="Temporary" />
</rule>

使用嵌入 IIS 服务器侦听端口号的 DNS/F5 别名访问服务器:该别名解析为两个负载平衡服务器之一。https://test-server/wsapp/local/47143

两年前,此重写会将客户端定向到 F5 选择的服务器的 FQDN:但现在不是了!307 - Location: https://mqa907b422x.testing.com:7899/local/47143

现在,它正在重用 DNS 别名并将客户端发送到具有 2 个端口号和无法访问的路径的完全虚假的地址。https://test-server:7899/local/47143

我看了看,它说“localhost is resolved using DNS”,没有关于本地主机名的行。/Windows/system/drivers/etc/hosts

IIS 如何解析?当我在盒子上执行操作时,它会返回主机的实际名称,但 IIS 不会!有人是怎么搞砸的?我应该更改什么才能恢复“服务器的主机名、DNS 别名或 IP 地址”的正确功能,因为它将显示在自引用 URL 中?(返回的别名不是自引用的,而是负载均衡器别名。{SERVER_NAME}nslookup

顺便说一句,GitHub Copilot (ChatGPT) 说这种新行为是正确的,并且取自请求的标头,但这不是文档所说的,也不是我以前的经验。专门用于绕过 DNS 别名并获取与本地计算机的连接。{SERVER_NAME}Host:{SERVER_NAME}

IIS URL 重写 DNS

评论

0赞 YurongDai 11/9/2023
您是否尝试过在重写规则中更改为?:返回 Web 服务器的名称。这可能与SERVER_NAME相同,也可能不同,具体取决于您在 Web 服务器上使用的名称解析类型(IP 地址、主机标头)。:服务器的主机名、DNS 别名或 IP 地址,显示在自引用 URL 中。{SERVER_NAME}{HTTP_HOST}HTTP_HOSTSERVER_NAME
0赞 Hoshi 11/11/2023
{HTTP_HOST} 返回入站主机标头,这是我试图避免的行为。
0赞 YurongDai 11/14/2023
请尝试使用FRT来跟踪重写规则,可以看到这些规则在内部是如何使用的。learn.microsoft.com/en-us/iis/extensions/url-rewrite-module/......
0赞 Hoshi 11/15/2023
@YurongDai这是一个很好的练习,但不幸的是,它向我展示的只是之前/之后的内容,即使“冗长”已打开,也没有添加任何新信息。没有迹象表明为什么不使用主机的 DNS 名称,而是使用 F5 别名。它确实将重写标记为“缓存不安全”,因此它认为它实际上正在更改请求的主机名,但事实并非如此。{SERVER_NAME}

答: 暂无答案