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 上加载正常