H2o: 服务器推送文档中缺少“as”属性

创建于 2017-05-17  ·  11评论  ·  资料来源: h2o/h2o

由于我将资产推送到 Chrome 的问题,我了解到预加载链接的“as”属性不是可选的而是必需的,例如<link rel=preload as=script href=...>

在 h2o 文档中,没有提到这一点,请参阅HTTP/2 Directives上的几个代码示例。

Using Mruby 中给出的“推送资产文件”

paths:
  "/":
    mruby.handler: |
      Proc.new do |env|
        push_paths = []
        # push css and js when request is to dir root or HTML
        if /(\/|\.html)\z/.match(env["PATH_INFO"])
          push_paths << "/css/style.css"
        end
        [399, push_paths.empty? ? {} : {"link" => push_paths.map{|p| "<#{p}>; rel=preload; as=style"}.join("\n")}, []]
      end
    mruby.handler: |
      Proc.new do |env|
        push_paths = []
        # push css and js when request is to dir root or HTML
        if /(\/|\.html)\z/.match(env["PATH_INFO"])
          push_paths << "/js/app.js"
        end
        [399, push_paths.empty? ? {} : {"link" => push_paths.map{|p| "<#{p}>; rel=preload; as=script"}.join("\n")}, []]
      end
    fastcgi.connect: ...

每种内容类型的相关属性都可以在标准草案中找到。

最有用的评论

感谢@deweerdt为文档提供补丁。

它包含一种更简单的方法,可以在同一个 mruby-handler 中添加多种不同的资源类型

所有11条评论

问题是我们使用链接头来控制服务器的推送行为。 然而,链接头也被链接到浏览器,在不支持 H2 Push 或 H1 的客户端的情况下,这将导致无效的链接头。

如果您只对控制 H2 服务器推送感兴趣,那么您可以将x-http2-push-only属性添加到链接标头。 较新的 h2o 版本将从链接头中删除推送的路径。

为了向后兼容 H1 和 H2 NoPush,我认为应该在文档中提到这一点。

有趣 - 我已经看到了这种变化,但当时我不明白它应该用来做什么。

但是,我不太确定如何实现这一点。 我只是在上面的例子中包含一个x-http2-push-only=true ,例如

..
        [399, push_paths.empty? ? {} : {"link" => push_paths.map{|p| "<#{p}>; rel=preload; as=script x-http2-push-only=true"}.join("\n")}, []]
...

@utrenkner链接头应该是这样的:

Link: </assets/style.css>; as=style; rel=preload; x-http2-push-only

请注意,规范说该元素是可选的。

as属性的值必须是有效的请求目标。 如果省略了提供的值,则该值将初始化为空字符串。

它还说在以下情况下预加载是合适的:

当已经在 Document 中的预加载链接的 link 元素的as属性被设置或更改为与先前获得的外部资源的请求目的地(如果有)不匹配或不再匹配的值时。

这就是我认为 Chrome 重新获取资源的原因。 我认为规范中缺少一个说明推送应该如何设置其request destination

谢谢你的澄清。 至于规格,我必须承认你是对的。

我最近在 Smashing Magazine 上阅读了这篇The as=style portion of the header is not optional. It informs the browser of the pushed asset’s content type. In this case, we use a value of style to indicate that the pushed asset is a style sheet. You can specify other content types. It’s important to note that omitting the as value can result in the browser downloading the pushed resource twice. So don’t forget it!

因此,从技术上讲,您可以省略“as”参数 - 但您不能指望浏览器做自己想做的事:提前下载资源并且只下载一次。

我刚刚通过 mruby 测试了x-http2-push-only ,它似乎没有按预期删除链接头或路径。

@worenga我可以确认这一点。 我只是在测试域上尝试过 - 这里是 WPT 与 IE10

看着关于 W3-Preload 标准的讨论,我想强调我最初的提议,我们应该在文档中真正包含“as”属性。 在讨论中,标准草案的编辑者解释说它实际上是必需的,即使它在客户端软件中并未普遍采用这种方式。

也就是说,我想知道我们是否可以向 h2o 添加一个功能,它会自动将 MIME 类型映射到请求目的地。 正如@igrigorik解释的那样,这不在规范中。 但我认为它可以包含在 h2o 中,至少作为可以覆盖的默认值。 这样,当我们将资源添加到推送路径时,我们就不必为每个请求目的地包含单独的 mruby 处理程序。 对于我们有问题的站点,我们现在有 4 个这样的 mruby 处理程序(用于样式、脚本、图像和字体)。

@utrenkner说:
也就是说,我想知道我们是否可以向 h2o 添加一个功能,它会自动将 MIME 类型映射到请求目的地。 正如@igrigorik解释的那样,这不在规范中。 但我认为它可以包含在 h2o 中,至少作为可以覆盖的默认值。

我喜欢这个主意。

我们应该在文档中真正包含“as”属性。

https://github.com/h2o/h2o/pull/1307

感谢@deweerdt为文档提供补丁。

它包含一种更简单的方法,可以在同一个 mruby-handler 中添加多种不同的资源类型

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

kazuho picture kazuho  ·  7评论

taosx picture taosx  ·  6评论

concatime picture concatime  ·  3评论

Ys88 picture Ys88  ·  5评论

utrenkner picture utrenkner  ·  3评论