IIS中{SERVER_NAME}无法返回主机名的问题排查与修复请求
IIS URLRewrite {SERVER_NAME} 取值异常问题排查与解决
一、IIS中{SERVER_NAME}的取值逻辑
IIS对{SERVER_NAME}的取值遵循以下优先级:
- 优先使用当前请求匹配的站点绑定主机名(若网站绑定了特定主机名);
- 若站点绑定为“全部未分配”,则读取请求的
Host:头值; - 同时受IIS服务器运行时配置
UseHostName控制:- 当
UseHostName=false(默认值):忽略请求Host头,使用服务器实际主机名; - 当
UseHostName=true:强制使用请求的Host头作为{SERVER_NAME}。
- 当
二、问题根因分析
你遇到的情况核心是{SERVER_NAME}现在取到了负载均衡别名test-server(来自请求Host头),而非服务器自身FQDN,可能的触发原因:
- 站点绑定变更:原本网站绑定的是服务器自身FQDN,后续被修改为“全部未分配”或绑定了
test-server别名; - UseHostName配置被修改:该配置被设置为
true,导致IIS强制读取Host头; - 运维操作变更:比如负载均衡侧调整了请求转发的Host头传递规则,或服务器主机名相关配置被修改。
三、解决方法
方法1:修改站点绑定,指定服务器自身FQDN
- 打开IIS管理器,定位到目标网站,右键选择「编辑绑定」;
- 新增或修改HTTPS绑定,将主机名设置为服务器实际FQDN(如
mqa907b422x.testing.com); - 确保绑定使用的SSL证书与该FQDN匹配;
- 保存配置后,{SERVER_NAME}将自动取绑定的主机名,即服务器自身FQDN。
方法2:修改IIS运行时配置,强制使用服务器主机名
以管理员身份打开命令提示符,执行以下命令(替换你的网站名称为实际站点名):
appcmd set config "你的网站名称" /section:system.webServer/serverRuntime /useHostName:False
该命令将强制IIS忽略请求Host头,使用服务器自身主机名作为{SERVER_NAME}的值。
方法3:直接在规则中硬编码服务器FQDN
如果负载均衡集群中每台服务器的FQDN固定,可直接替换规则中的{SERVER_NAME}为实际FQDN:
<rule name="WebSocket" enabled="true" stopProcessing="true"> <match url="wsapp/(.*)" /> <action type="Redirect" url="https://mqa907b422x.testing.com:7899/{R:1}" redirectType="Temporary" /> </rule>
此方法简单直接,但需为集群中每台服务器单独配置对应规则。
四、验证方法
可在网站中添加测试页面,输出SERVER_NAME变量确认取值:
- ASP.NET页面:
<%= Request.ServerVariables["SERVER_NAME"] %> - PHP页面:
<?php echo $_SERVER['SERVER_NAME']; ?>
内容的提问来源于stack exchange,提问作者Hoshi
相关产品推荐
相关产品推荐

