Windows 2016 IIS 上 HTTP/2 的混合模式

Posted

技术标签:

【中文标题】Windows 2016 IIS 上 HTTP/2 的混合模式【英文标题】:Mixed Mode for HTTP/2 on Windows 2016 IIS 【发布时间】:2018-12-29 09:29:24 【问题描述】:

背景

我有一个运行两个网站的场景,网站 A 托管在运行 IIS 10 的 Server 2016 上,网站 B 托管在运行 Apache 2.2 的 CentOS 6 上。这两个网站都使用 HTTPS 提供服务,并且在本地网络上运行良好。在公开场合,我使用 IIS 服务器上的 SNI 和 URL 重写规则来访问 Apache 2.2 服务器。

大部分用户代理都可以正常访问B网站,但是ios会报错“加载资源失败,操作无法完成。协议错误”并显示空白屏幕。我已确定原因与 IIS 提供 HTTP/2 响应有关,即使 Apache 2.2 不支持这些请求。

问题

有什么方法可以在 IIS 10 上的特定站点上禁用 HTTP/2 响应?我发现了很多完全禁用它的说明,但是网站 A 上的性能改进太大了,不容忽视。

【问题讨论】:

【参考方案1】:

我不知道该怎么做。 HTTP/2 允许连接合并,因此将尝试为尽可能多的站点重用 HTTP/2 连接。

但是,您的设置应该可以正常工作。我建议问题可能是您的 Apache 2.2 设置中的 HTTP 标头错误。 HTTP/2 对这些更严格,而 HTTP/1 会尽量继续,尽管有错误的标头,所以一个错误的多行标头没有正确关闭,或者名称中有空格或双精度的标头冒号,可能会导致问题。奇怪的是它只是iOS。你在 Chrome 上看不到这个? Chrome has a nice way of debugging these,但如果只是在 iOS 上,这可能会更加困难。除非您将特定的错误标头发送回仅限 iOS 的客户端?

哦,顺便说一句,升级 Apache 2.2。它已经停产一年多了,不再修补!帮自己一个忙,升级到 2.4。如果在 Windows 上,那么它应该很容易安装,尽管 some of the config options have been changed。如果您找不到解决此问题的其他方法,您始终可以为此分配一个单独的 IP 地址并直接托管它,而不是通过 IIS,但您当然不应该使用旧的、不受支持的软件。

【讨论】:

在 iOS 和 MacOS 上,在 Safari 之外几乎没有问题。甚至 MacOS 上的 Chrome 也能正常工作,虽然在 iOS 上不行(我猜是因为它使用了内置的 webkit)。但即使在 iOS 上也不一致。奇怪的是 CalDAV 和 CardDAV 继续连接和刷新就好了。我可能会寻找支持 HTTP/2 的发行版,而不是继续桥接 CentOS 6,直到我最终刷新服务器。同时,如果移动用户尝试访问这些网站,我会发出 403 错误。 好吧,这让你很难弄清楚,但我仍然会查看你的 HTTP 标头,看看那里是否有一个狡猾的标头。

以上是关于Windows 2016 IIS 上 HTTP/2 的混合模式的主要内容,如果未能解决你的问题,请参考以下文章

IIS/Windows Server 2019 没有 HTTP/2

Windows server 2016 搭建IIS(web)服务

Windows Server 2016 安装 IIS 服务时提示指定备用源路径

网址重写未安装在 Windows 10 IIS 10 上

Windows 2016 如何配置 IIS 和 PHP

Sharepoint 2016:IIS - 使用登录凭据身份而不是 AppPool 身份