Safari v12+;上的跨源服务器推送额外请求问题;(MacOS和iOS)

Safari v12+;上的跨源服务器推送额外请求问题;(MacOS和iOS),safari,http2,server-push,Safari,Http2,Server Push,问题:Safari正在使用推送路径执行请求,但指向站点主机,导致404 场景:服务器推送的跨源资产。资产的主机和站点的主机是不同的域 浏览器:MacOS和iOS中的SafariV12+(也是v13) 值得注意的是,服务器推送功能本身可以工作,但Safari会向主机发出此额外请求。在Safary v10或v11上也不会发生这种情况 场景:服务器推送的跨源资产。资产的主机和站点的主机是不同的域 除非在非常有限的情况下,否则无法将资源推送到另一个域。服务器必须对此服务器具有身份验证。基本上,这意味着它

问题:Safari正在使用推送路径执行请求,但指向站点主机,导致404

场景:服务器推送的跨源资产。资产的主机和站点的主机是不同的域

浏览器:MacOS和iOS中的SafariV12+(也是v13)

值得注意的是,服务器推送功能本身可以工作,但Safari会向主机发出此额外请求。在Safary v10或v11上也不会发生这种情况

场景:服务器推送的跨源资产。资产的主机和站点的主机是不同的域

除非在非常有限的情况下,否则无法将资源推送到另一个域。服务器必须对此服务器具有身份验证。基本上,这意味着它进入相同的IP地址,并由相同的证书覆盖。因此,如果您在www.example.com上,并且在同一台服务器上的static.example.com上有一个单独的分片域,理论上您可以从中推送。然而,我真的不推荐它。您可以使用preload资源提示来代替它,这样可以更好地理解和支持它

问题:Safari正在使用推送路径向站点主机发出请求

根据上面的链接,Safari不支持跨域推送。其他浏览器也不例外

导致404

这是有道理的,因为您请求推送的资源在该域上不存在

值得注意的是,服务器推送功能本身可以工作,但Safari会向主机发出此额外请求

那你认为它为什么会起作用

在Safary v10或v11上也不会发生这种情况


什么事没有发生?推?双重下载?两者都有?

我也遇到了这个问题,并确认(通过使用Charles Proxy重新编写)如果链接头使用包含域的绝对路径,Safari确实会从跨源域加载链接头中的资源

这种类型的HTTP响应在Safari中将不起作用:

HTTP/2 200
content-type: application/javascript; charset=utf-8
... other headers
link: </script.js>; rel=preload; as=script; crossorigin
HTTP/2200 内容类型:application/javascript;字符集=utf-8 ... 其他标题 链接:;rel=预载;as=脚本;交叉起源 相反,您需要包含完整的域和协议,如下所示:

HTTP/2 200
content-type: application/javascript; charset=utf-8
... other headers
link: <https://www.example.com/script.js>; rel=preload; as=script; crossorigin
HTTP/2200 内容类型:application/javascript;字符集=utf-8 ... 其他标题 链接:;rel=预载;as=脚本;交叉起源
这与大多数服务器推送教程不同,后者的路径是从域的根(例如/script.js)开始的绝对路径,但我已经确认,即使服务器推送响应针对的是与HTML页面所在域不同的域上的JavaScript资源,它在Safari中也能正常工作。

1。您可以从不同于站点的域推送资源。2.这不是推送在其他浏览器中的工作方式。3.Safari v10和v11.1上都没有双重下载。你说对了一半。答案已更新。2.答案已更新。3.这并没有表明它正在发生。这不是一回事。资源是否在SafariV10和v11中推送?无论哪种方式,我都强烈建议不要跨域推送。。。如果有(根据我答案中的链接,推送很复杂,可能建议不要使用)。我相信可能存在误解。我认为您指的是向a.com/asset-1发出请求并尝试推送b.com/asset-2的情况,我同意服务器推送是不可能的。但我指的是c.com加载了d.com/asset-1,并试图推送d.com/asset-2的情况。这种推动是有效的。从某种意义上说,站点(c.com)与推送的资产(d.com来自d.com/asset-2)是不同的域,这是跨源的。因此c.com请求d.com/asset-1,然后asset-1也推送资产-2,推送是从d.com的服务器进行的?是的,这应该行得通——除非这是一个有凭证的与无凭证的请求。举一个例子来说明什么不起作用在这里真的很有帮助。我今天遇到了这个问题,并确认(通过使用Charles Proxy重新编写)如果链接头使用包含域且具有crossorigin参数的绝对路径,Safari确实会从跨源域加载链接头中的资源。e、 g.
链接:;rel=预载;as=脚本;交叉原点
。这与大多数服务器推送教程不同,后者的路径是从域的根(例如
/script.js
)开始的绝对路径。这很有效!虽然在我的测试中不需要“crossorigin”参数,但使用绝对路径就足够了。如果你写这篇文章作为一个常规的答案,我可以把它标记为被接受的答案。很高兴它奏效了!我补充了一个答案: