Safari 不会加载超过 http/2 的一些资源
Safari won't load some resources over http/2
Http/2 在服务器上启用,昨天我注意到在 Iphone (IOS 10.2) 上没有加载某些资源并出现错误:failed to load resource:connecting to server is not possible
。当我将 Iphone 连接到 Mac 时,控制台中没有错误,只是一些请求的结果直接导致该错误。有趣的是,未加载的资源是真实域的子域(CNAME 是正确的)。网站在 https 上。
服务器是 Windows 服务器 2016.
编辑:
我们解决了这个子域问题,但仍然有来自同一域的请求没有任何响应。
我知道 IOS > 9.3 支持 http/2 当资源通过 https 加载时,但不工作的资源不属于该域可能有助于解决这个问题,但我不知道怎么做。
我知道问题可能与 http/2 协议有关,因为我的 android 本机应用程序也停止工作并出现错误: java.io.IOException: stream was reset: PROTOCOL_ERROR
。我通过强制我的应用程序使用 http/1 解决了这个问题。现在有效。但是如何解决 iphone Safari 问题?
我正在使用 ASP.NET Web 表单作为后端(支持 http2,因为我正在使用 ASP.NET 4.6)。
看来找到解决办法了。经过几天的调查禁用 动态内容压缩有所帮助。
Vlado Pandžić 已经在上面正确地提供了答案。
我无法发表评论,因为我是这个网站的新手,但我想添加一些我发现的东西。
IOS不到11版本才支持HTTP/2。但!如果页面太大和压缩,它会卡住。我不确定截止点是什么,但是如果您打开一个具有动态压缩(Gzip 或其他)的小页面,它会正常工作。 ASP 或 PHP 等都没有关系。一旦页面达到需要多次往返才能提取数据的压缩数据大小时,Safari 就会陷入困境。
它实际上会进入一个无限循环,用请求敲打你的服务器。当 Safari 卡在空白屏幕上时,我看到了数千页点击。
我的问题是,在整个网站上禁用动态压缩会导致 Google 对移动设备友好性的处罚。 Google 希望您打开压缩,但您必须为 Safari 禁用它,这很糟糕。
我的解决方案是在整个网站上启用动态压缩,但我使用 web.config 文件为我知道可能非常大的特定页面禁用它。
<location path="large-page.aspx">
<system.webServer>
<urlCompression doDynamicCompression="false" />
</system.webServer>
</location>
祝你好运!
马特
您也可以禁用 gZip 并使用 brotli 代替压缩,旧版本的 Safari 不支持它,所以它似乎可以工作。
这是一个很老的话题,但是,如果您不想切断旧的 iOS 设备,那么有一个比禁用此站点(接受的答案)或所有站点的所有压缩更好的答案给定资源的浏览器 (Matt Deemer)。
URL 重写规则可以仅针对重要的资源和浏览器禁用压缩。
最近,我想将一个已建立的经典 ASP 站点移动到 HTTP/2。
,该站点可以为动态创建的大型资源提供服务
以下规则允许除旧版 WebKit 之外的所有人压缩内容。
<rule name="No compression for old WebKit">
<match url="^(.+\.asp.*)" />
<conditions>
<add input="{HTTP_USER_AGENT}" pattern="AppleWebKit\/60[0-3]" />
</conditions>
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="none" />
</serverVariables>
<action type="Rewrite" url="{R:1}" />
</rule>
注意:WebKit/604 及更高版本没有 http/2 - 压缩问题。
Http/2 在服务器上启用,昨天我注意到在 Iphone (IOS 10.2) 上没有加载某些资源并出现错误:failed to load resource:connecting to server is not possible
。当我将 Iphone 连接到 Mac 时,控制台中没有错误,只是一些请求的结果直接导致该错误。有趣的是,未加载的资源是真实域的子域(CNAME 是正确的)。网站在 https 上。
服务器是 Windows 服务器 2016.
编辑: 我们解决了这个子域问题,但仍然有来自同一域的请求没有任何响应。
我知道 IOS > 9.3 支持 http/2 当资源通过 https 加载时,但不工作的资源不属于该域可能有助于解决这个问题,但我不知道怎么做。
我知道问题可能与 http/2 协议有关,因为我的 android 本机应用程序也停止工作并出现错误: java.io.IOException: stream was reset: PROTOCOL_ERROR
。我通过强制我的应用程序使用 http/1 解决了这个问题。现在有效。但是如何解决 iphone Safari 问题?
我正在使用 ASP.NET Web 表单作为后端(支持 http2,因为我正在使用 ASP.NET 4.6)。
看来找到解决办法了。经过几天的调查禁用 动态内容压缩有所帮助。
Vlado Pandžić 已经在上面正确地提供了答案。 我无法发表评论,因为我是这个网站的新手,但我想添加一些我发现的东西。
IOS不到11版本才支持HTTP/2。但!如果页面太大和压缩,它会卡住。我不确定截止点是什么,但是如果您打开一个具有动态压缩(Gzip 或其他)的小页面,它会正常工作。 ASP 或 PHP 等都没有关系。一旦页面达到需要多次往返才能提取数据的压缩数据大小时,Safari 就会陷入困境。
它实际上会进入一个无限循环,用请求敲打你的服务器。当 Safari 卡在空白屏幕上时,我看到了数千页点击。
我的问题是,在整个网站上禁用动态压缩会导致 Google 对移动设备友好性的处罚。 Google 希望您打开压缩,但您必须为 Safari 禁用它,这很糟糕。
我的解决方案是在整个网站上启用动态压缩,但我使用 web.config 文件为我知道可能非常大的特定页面禁用它。
<location path="large-page.aspx">
<system.webServer>
<urlCompression doDynamicCompression="false" />
</system.webServer>
</location>
祝你好运!
马特
您也可以禁用 gZip 并使用 brotli 代替压缩,旧版本的 Safari 不支持它,所以它似乎可以工作。
这是一个很老的话题,但是,如果您不想切断旧的 iOS 设备,那么有一个比禁用此站点(接受的答案)或所有站点的所有压缩更好的答案给定资源的浏览器 (Matt Deemer)。
URL 重写规则可以仅针对重要的资源和浏览器禁用压缩。
最近,我想将一个已建立的经典 ASP 站点移动到 HTTP/2。
,该站点可以为动态创建的大型资源提供服务以下规则允许除旧版 WebKit 之外的所有人压缩内容。
<rule name="No compression for old WebKit">
<match url="^(.+\.asp.*)" />
<conditions>
<add input="{HTTP_USER_AGENT}" pattern="AppleWebKit\/60[0-3]" />
</conditions>
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="none" />
</serverVariables>
<action type="Rewrite" url="{R:1}" />
</rule>
注意:WebKit/604 及更高版本没有 http/2 - 压缩问题。