假设我有一个服务器在网址https://example.com/
上提供HTML文件,这指的是网址https://test.com/mystyles.css
上的css文件。是否可以将mystyles.css
文件作为HTTP2连接的一部分与html内容一起推送,以便浏览器使用此css内容?
我试图在我的localhost上使用自签名证书创建这样的请求(我已经为我的浏览器中的两个主机预先创建了一个安全例外),当请求到达{{1时}发送html文件在http://localhost/
或:authority
标头中使用不同的主机名/端口推送css。但是,在整页刷新时,CSS文件是从服务器的单独请求中获取的,而不是使用推送的css文件。
有关我用来测试此文件的文件,请参阅this gist。如果我访问Host
,则文字为红色,但如果我访问http://localhost:8080/
,则为绿色,表示如果原点相同,则会使用推送的内容。
是否需要使用标头组合才能实现此功能?可能会调用CORS?
答案 0 :(得分:2)
是的,根据2017年的blog post from a Chrome developer advocate,理论上是可能的。
作为developers.google.com/web的所有者,我们可以将服务器连接到 推送包含我们想要的android.com内容的响应,并进行设置 可以缓存一年。
...
您不能将资产用于 任何来源,但您可以将资产推入与您的联系相关的来源 是“权威”。
如果您查看developers.google.com的证书,则可以看到 它对各种Google血统都具有权威性,包括 android.com。
在Chrome Now中查看证书信息,我撒了点谎, 因为当我们获取android.com时,它将执行DNS查找并查看 它终止于与developers.google.com不同的IP,因此 它将建立一个新的连接,并在推送缓存中丢失我们的项目。
我们可以使用ORIGIN框架解决此问题。这使 连接说“嘿,如果您需要android.com提供的任何功能,请问 我。不需要做任何DNS东西”,只要它是 权威性。这对于常规连接合并很有用,但是 它是非常新的,并且仅在Firefox Nightly中受支持。
如果您使用的是CDN或某种共享主机,请查看 证书,查看哪些来源可以开始为您推送内容 现场。有点恐怖值得庆幸的是,没有主机(我知道)可以完全控制HTTP / 2推送,并且不太可能要感谢规范中的这一小注释:...
在实践中,听起来好像您的证书可能具有对其他域的权限,并且它们托管在相同的IP地址,但这也取决于浏览器的支持。我个人尝试使用Cloudflare进行此操作,发现它们不支持跨域推送(类似于博客作者在2017年对CDN的观察)。