Windows Server 2016上IIS 10为何用HTTP 1.1而非HTTP/2提供HTTPS内容?
解决IIS 10(Windows Server 2016)HTTPS站点在Chrome 63中不使用HTTP/2的问题
我来帮你捋捋这个有点矛盾的问题——KeyCDN检测说站点支持HTTP/2,但Chrome 63和Lighthouse却始终走HTTP/1.1,这大概率是Chrome的版本限制或者IIS配置里的细节没踩对。下面是几个实用的排查方向和解决办法:
1. 先确认Chrome 63的HTTP/2支持门槛
Chrome 63这类早期版本对HTTP/2的TLS环境有严格要求:必须启用TLS 1.2及以上版本,且不能用老旧的加密套件。你可以这么检查:
- 打开IIS管理器,找到目标站点→右键「编辑绑定」→选中HTTPS绑定→点击「编辑」→确认SSL证书没问题后,点击「查看」→在SSL设置里禁用TLS 1.0、1.1,只保留TLS 1.2及以上。
- 同时调整加密套件优先级,优先选择Chrome支持的现代套件,比如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,避开RC4、3DES这类过时套件。
2. 验证IIS的HTTP/2是否真的生效
虽然检测工具显示支持,但可能IIS的HTTP/2配置有遗漏:
- 切换到IIS的服务器级别(不是单个站点),找到「HTTP/2」功能,确认它是启用状态。Windows Server 2016的IIS 10默认支持HTTP/2,但偶尔会被意外关闭。
- 检查站点的应用程序池,必须使用集成模式——经典模式下IIS不会触发HTTP/2。
3. 排除Chrome自身的干扰因素
Chrome的缓存、扩展有时候会导致协议降级:
- 用隐私模式(Ctrl+Shift+N)访问站点,如果隐私模式下能正常用HTTP/2,说明是扩展或缓存的锅。
- 清除Chrome的缓存(Ctrl+Shift+Delete),只勾选「缓存的图片和文件」,然后重启浏览器重试。
- 可以在Chrome地址栏输入
chrome://net-internals/#http2,查看HTTP/2的连接状态,看看你的站点是否在「Active Sessions」里,有没有报错提示。
4. 检查混合内容和请求协议
如果站点里有HTTP资源(混合内容),Chrome会自动降级到HTTP/1.1:
- 打开Chrome开发者工具(F12)→Network面板,右键表头勾选「Protocol」,查看每个请求的协议列。如果是
h2就是HTTP/2,http/1.1则是降级状态。 - 确保页面所有资源(图片、脚本、样式)都是HTTPS引用,没有
http://的链接。
5. 最后排查TCP层面的限制
这个概率较低,但可以作为兜底:检查Windows Server 2016的TCP设置,比如是否启用了TCP Fast Open,或者有没有防火墙/安全组限制了HTTP/2的连接。
我之前碰到过类似案例,就是因为IIS还开着TLS 1.0,Chrome 63直接拒绝使用HTTP/2,禁用旧TLS版本后就正常了。你可以按上面的步骤逐一排查,应该能解决问题。
内容的提问来源于stack exchange,提问作者Jimbo




