为什么我的 IIS 日志中的 cs-host 字段包含 IP 地址和端口而不是主机名?

为什么我的 IIS 日志中的 cs-host 字段包含 IP 地址和端口而不是主机名?

问题摘要:

IIS 中的 URL 重写/应用程序请求路由是否意味着该cs-host字段不再记录请求主机名,而是记录目标服务器 IP 和端口?如果是这样,我如何在 IIS 日志中记录主机名?

问题详情:

我有一个多租户应用程序托管在多个 IIS 服务器上,到目前为止还没有记录cs-host字段。我cs-host在 W3C 日志记录字段对话框中进行了选择,然后惊讶地发现记录的是我的服务器 IP 地址和端口,而不是请求的主机名 :-(

我猜这与我使用 URL Rewrite/ARR 有关。以下是我使用 URL Rewrite 的方式:

  • 每个租户都有自己的子域名,例如atenant.mycoolapp.com
  • 所有子域名都指向我的主要 IIS 服务器的 IP 地址,我们称之为 10.52.123.40
  • 在该服务器上的一个网站上绑定的是*.mycoolapp.com,因此所有请求都转到该网站
  • 该网站上配置了 URL 重写,以便将不同的 URL 路径重写到不同的网站,一些网站位于同一台服务器上,一些网站位于其他 IIS 服务器上。例如,这里有一条规则,将所有以“api/account/”开头的路径的 URL 重写到不同的 IIS 服务器,我们将其称为 IP 10.52.123.45:
Input: URL path after '/'
Match: Matches
Pattern: ^api/account/(.*)
Action Type: Rewrite
Action URL: https://10.52.123.45:1200/api/account/{R:1}
  • 所有规则都勾选了“记录重写的 URL”,但取消勾选不会改变任何内容。

记录的服务器 IP 地址和端口是重写的,即实际托管处理请求和生成响应的代码的服务器和 IP。

我已在接收初始请求的网站和接收重写请求的网站都启用了cs-host日志记录。它们都在字段中包含 IP 和端口,而不是主机名cs-host

以下是我主网站的 IIS 日志文件中的一行示例(我已替换 IP 地址)。我在其他网站日志中也遇到了同样的问题(即 cs-host 中的服务器 IP 和端口,而不是主机名)。

#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2020-09-30 00:00:00
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes time-taken
2020-09-30 00:00:04 10.52.123.40 GET /api/admin/system/users/admin - 443 - 12.34.56.100 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/85.0.4183.121+Safari/537.36 https://atenant.mycoolapp.com/ 10.52.123.45:1200 200 0 0 770 46

所以我的问题是:是 URL Rewrite/ARR 在执行此操作吗?如果是,我该如何记录请求的主机名?

答案1

感谢@LexLi 向我指出设置 IIS 反向代理以保留主机头。如果我设置,system.webServer/proxy.preserveHostHeader=True那么请求的主机将同时记录在 ARR 服务器和其他 IIS 服务器中。

如果我没有进行该设置,我仍然认为重写的主机名会使用 ARR 记录在服务器上,这很奇怪True,但这个解决方案对我来说已经足够好了。

相关内容