【问题标题】:Is a Http2 Cross-origin push request possible?可以进行 Http2 跨域推送请求吗?
【发布时间】:2016-07-07 21:02:02
【问题描述】:

假设我有一个服务器在 url https://example.com/ 处提供 HTML 文件,这指的是在 url https://test.com/mystyles.css 处的 css 文件。作为 HTTP2 连接的一部分,是否可以将 mystyles.css 文件与 html 内容一起推送,以便浏览器使用此 css 内容?

我尝试在我的本地主机上使用自签名证书创建这样一个请求(并且我已经在我的浏览器中预先为两个主机创建了一个安全异常),方法是在请求到达http://localhost/ 时发送 html 文件,并在 :authorityHost 标头中推送具有不同主机名/端口的 css。但是,在整页刷新时,CSS 文件是在来自服务器的单独请求中获取的,而不是使用推送的 css 文件。

请参阅this gist 以获取我用来测试的文件。如果我访问http://localhost:8080/,则文本为红色,但如果我访问http://test:8080/,则为绿色,表示如果来源相同,则使用推送的内容。

是否需要使用标题组合才能使其正常工作?可能会调用 CORS?

【问题讨论】:

  • 根据规范,如果你用证书做对了,它不会是非法的。但是,我认为浏览器目前不接受它。
  • 规格是否明确说明了这一点?能给个链接吗?
  • section 8.2 的最后一段之前的第二个,然后是第 10.1 节。然后到另一个 RFC,当服务器在 TLS 下具有权威性时,这里是:tools.ietf.org/html/rfc2818#section-3
  • 考虑在Link: 标头末尾添加;crossorigin 属性。查看来自here(或here)的示例

标签: cross-domain http2


【解决方案1】:

是的,根据 2017 年的 blog post from a Chrome developer advocate,理论上是可能的。

作为 developers.google.com/web 的所有者,我们可以让我们的服务器 推送一个包含我们想要的 android.com 的响应,并设置 缓存一年。

...

您不能推送资产 任何来源,但您可以推送您连接的来源的资产 是“权威的”。

如果您查看 developers.google.com 的证书,您会看到 它对各种 Google 来源都具有权威性,包括 android.com。

现在在Chrome中查看证书信息,我撒了一点谎, 因为当我们获取 android.com 时,它会执行 DNS 查找并查看 它以与developers.google.com不同的IP终止,所以 它会建立一个新的连接并错过我们在推送缓存中的项目。

我们可以使用 ORIGIN 框架来解决这个问题。这让 连接说“嘿,如果你需要来自 android.com 的任何东西,请问 我。不需要做任何 DNS 的事情”,只要它是 权威性。这对于一般连接合并很有用,但是 它是相当新的,仅在 Firefox Nightly 中支持。

如果您使用的是 CDN 或某种共享主机,请查看 证书,看看哪些来源可以开始为您推送内容 地点。这有点可怕。值得庆幸的是,没有主机(据我所知)提供对 HTTP/2 推送的完全控制,并且不太可能感谢规范中的这个小注释:...

实际上,如果您的证书对其他域具有权限并且它们托管在相同的 IP 地址上,这听起来是可能的,但这也取决于浏览器的支持。我个人尝试用 Cloudflare 来做这件事,发现它们不支持跨域推送(类似于博文作者在 2017 年对 CDN 的观察)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2020-01-07
    • 2016-04-30
    • 2012-08-21
    • 2011-10-28
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多