Safari 不会通过 http/2 加载一些资源

Posted

技术标签:

【中文标题】Safari 不会通过 http/2 加载一些资源【英文标题】:Safari won't load some resources over http/2 【发布时间】:2017-09-01 09:38:01 【问题描述】:

在服务器上启用了 Http/2,昨天我注意到在 Iphone (ios 10.2) 上没有加载一些资源错误:failed to load resource:connecting to server is not possible。当我将 Iphone 连接到 Mac 时,控制台中没有错误,只是某些请求的结果立即导致该错误。有趣的事情可能是未加载的资源是真实域的子域(CNAME 是正确的)。网站在 https 上。 服务器是 Windows server 2016。

编辑: 我们解决了这个子域问题,但仍然有来自同一域的请求没有响应。

我知道 IOS > 9.3 在通过 https 加载资源时支持 http/2,但是不工作的资源不属于该域可以帮助解决此问题,但我不知道如何解决。

我知道问题可能与 http/2 协议有关,因为我的 android 本机应用程序也因错误而停止工作: java.io.IOException: stream was reset: PROTOCOL_ERROR 。我通过强制我的应用程序使用 http/1 解决了这个问题。现在工作。但是如何解决那个 iphone safari 问题呢?

我使用 ASP.NET Web 窗体作为后端(从我使用的 ASP.NET 4.6 开始支持 http2)。

【问题讨论】:

你遇到了有趣的问题。 PS:格式化。 您的 SSL 证书是仅为真实域颁发的,还是为子域颁发的通配符证书? 是的,并且适用于子域,但我最近注意到实际域(不是子域)中的某些页面无法加载。如果我打开在 Chrome 或 Firefox 中不起作用的页面,我会得到响应(虽然是 http 1.1)响应。在 Mac 上的 Chrome 上运行的页面也可以运行并返回 http2 响应。我网站上的某些内容可能会阻止返回 http2 响应吗?还是 IIS 有问题,无法降级对相同页面的请求? 我们尝试通过添加 EnableViewState="false" 在有问题的 ASP.NET WebForms 页面上禁用视图状态,它似乎在某些情况下有所帮助(一些页面现在正在打开),但仍然没有最终解决方案... 【参考方案1】:

您也可以禁用 gZip 并使用 brotli 来代替压缩,旧版本的 Safari 不支持它,所以它似乎可以工作。

https://github.com/saucecontrol/Brotli-IIS

【讨论】:

【参考方案2】:

Vlado Pandžić 已经在上面正确地提供了答案。 我无法发表评论,因为我是这个网站的新手,但我想添加一些我发现的内容。

低于版本 11 的 IOS 确实支持 HTTP/2。但!如果页面太大并且被压缩,它会卡住。我不确定截止日期是什么,但是如果您打开一个具有动态压缩(Gzip 或其他)的小页面,它会正常工作。 ASP 或 php 等,没关系。一旦页面达到需要多次往返来提取数据的压缩数据大小,那么 Safari 就会大吃一惊。

它实际上会进入一个无限循环,用请求锤击你的服务器。当 Safari 卡在一个空白的白色屏幕上时,我看到了成千上万的页面点击量。

对我来说,问题是在您的整个网站上禁用动态压缩会导致 Google 因移动设备友好性而受到处罚。谷歌希望你开启压缩,但你必须为 Safari 禁用它,这很糟糕。

我对此的解决方案是在整个网站上启用动态压缩,但我使用 web.config 文件为我知道可能非常大的特定页面禁用它。

<location path="large-page.aspx">
    <system.webServer>
        <urlCompression doDynamicCompression="false" />
    </system.webServer>
</location>

祝你好运!

马特

【讨论】:

【参考方案3】:

似乎找到了解决方案。经过几天的调查禁用动态内容压缩有所帮助。

【讨论】:

问题是你必须为整个网站这样做,然后因为不“移动友好”而受到谷歌的惩罚。

以上是关于Safari 不会通过 http/2 加载一些资源的主要内容,如果未能解决你的问题,请参考以下文章

Http/2 站点仅在 Safari 9 上无法加载 - 在 Chrome、IE、Edge、Firefox 上加载正常

加载资源失败:Safari 上的请求超时

Safari ajax 请求加载资源失败:网络连接丢失

加载资源失败:下载多个文件时,Safari 浏览器中的帧加载中断

如何使Safari播放本地音频资源?

Ajax 文件上传“尝试加载资源时发生错误”和网络连接在 Safari 中丢失