Windows Server 2016 IIS 10配置HSTS时HTTP多余HSTS头警告的解决方法
问题原因
现有配置仅实现了HTTPS场景下添加HSTS头的逻辑,未对HTTP场景下已存在的HSTS头做清除处理。大部分站点无额外HSTS头配置所以运行正常,这两个站点存在额外的HSTS头来源(如CMS插件、服务器全局规则、手动添加的自定义响应头、IIS原生HSTS误开启),导致HTTP响应(包括301重定向响应)中残留HSTS头,触发安全扫描告警。
解决方案
第一步:排查多余HSTS头的来源
- 检查问题站点的
web.config文件,若存在<system.webServer>节点下的 Strict-Transport-Security自定义头配置,直接删除该配置项。 - 检查服务器全局配置:打开
%SystemRoot%\System32\inetsrv\config\applicationHost.config,查找是否有全局添加的HSTS自定义头或全局出站规则,如有则直接删除,或补充仅HTTPS生效的条件。 - 检查IIS原生HSTS配置:在IIS管理器中选中对应站点,打开「HSTS」配置项,若已开启建议直接关闭,避免和现有URL Rewrite配置冲突。
第二步:调整web.config出站规则
将原有
<outboundRules> <!-- HTTPS场景下添加标准HSTS头 --> <rule name="Add Strict-Transport-Security when HTTPS" enabled="true"> <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" /> <conditions> <add input="{HTTPS}" pattern="on" ignoreCase="true" /> </conditions> <action type="Rewrite" value="max-age=31536000; includeSubDomains; preload"/> </rule> <!-- HTTP场景下强制移除所有HSTS头 --> <rule name="Remove Strict-Transport-Security when HTTP" enabled="true"> <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Rewrite" value="" /> </rule> </outboundRules>
补充说明:如果问题站点使用了IIS ARR反向代理,客户端到代理的协议和代理到后端站点的协议不一致,导致
{HTTPS}变量识别错误,可将两个出站规则的条件输入从{HTTPS}替换为{HTTP_X_FORWARDED_PROTO},匹配值分别调整为^https$(添加规则)和^http$(移除规则)即可。
第三步:验证配置
- 验证HTTP响应:执行命令
curl -I http://sandairephotography.com,确认返回响应头中无Strict-Transport-Security字段。 - 验证HTTPS响应:执行命令
curl -I https://sandairephotography.com,确认返回响应头中包含配置的HSTS参数。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

