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

Cross origin Server Push extra request issue on Safari v12+ (both MacOS and iOS)

问题:Safari 正在使用推送的路径发出请求,但发送给站点主机,导致 404。

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

浏览器:MacOS 和 iOS 中的 Safari v12+(也是 v13)。

值得注意的是,服务器推送功能本身是有效的,但 Safari 向主机发出了这个额外的请求。此外,这不会发生在 Safary v10 或 v11 上。

Scenario: Cross origin asset that is server pushed. Asset's host and site's host are different domains.

除非在非常有限的情况下,否则您不能为另一个域推送资源。服务器必须是此服务器的 authorative。基本上这意味着它转到相同的 IP 地址并由相同的证书覆盖。因此,如果您在 www.example.com 上并且在同一台服务器上的 static.example.com 上有一个单独的分片域,理论上您可以从中推送。但是 browser support is really poor for this 我真的不推荐它。您可以使用预加载资源提示来代替它,这更容易理解和支持。

Problem: Safari is doing a request with the pushed path but to the site host

根据上述link,Safari 不支持跨域推送。许多其他浏览器也没有。

resulting in 404s.

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

It is worth noting that the server push feature it self works, but Safari makes this extra request to the host.

那你认为它为什么有效?

Also this doesn't happen on Safary v10 or v11.

什么没有发生?推动?双重下载?两个?

我 运行 也参与其中,并确认(通过 re-writing 使用 Charles Proxy)Safari 确实从 [=25] link header 中加载资源=] 域,如果 link header 使用包含域 .

绝对路径

这种类型的 HTTP 响应不能在 Safari 中工作:

HTTP/2 200
content-type: application/javascript; charset=utf-8
... other headers
link: </script.js>; rel=preload; as=script; crossorigin

相反,您需要包含完整的域和协议,如下所示:

HTTP/2 200
content-type: application/javascript; charset=utf-8
... other headers
link: <https://www.example.com/script.js>; rel=preload; as=script; crossorigin

这与大多数服务器推送教程不同,后者的路径是从域的根开始的绝对路径(例如 /script.js),但我已经确认即使 server-push 响应是针对与 HTML 页面所在域不同的域中的 JavaScript 资源。