【发布时间】:2020-01-20 04:48:32
【问题描述】:
基本上,如果您在响应中设置标头 Vary: Accept,则使用 http2_push_preload 的 http2 推送不起作用,因为您正在使用 Accept 请求标头进行内容协商。我正在使用内容协商向支持它的客户端发送(http2 推送)webp 图片而不是 jpg。
HTTP/2 Push 适用于 .js、.css 文件和所有在同一个调用中,并在 Chrome DevTools 中显示“Push/Other”,但对于这种独特的情况(jpg 内容与 webp 协商)失败,并且只显示Chrome DevTools 中的“其他”(未推送)。
brotli 的内容协商、gzip 压缩都可以正常工作,并且可以使用 Vary: Accept-Encoding 正确推送,对于使用 Vary: Accept-Language 的语言也是如此。
仅变化:接受失败。 请帮助我正在放弃。
P.S:我正在通过 nginx 源 https://github.com/nginx/nginx/blob/master/src/http/v2/ngx_http_v2.c。执行 Crtl+F,您会发现只有“Accept-Encoding”和“Accept-Language”的案例,“Accept”没有。所以我认为nginx还不支持“接受”的情况??
P.P.S:我并没有过度推送,只是使用 http2 推送来获取英雄图像。
编辑:这是 nginx 网站上的错误票,供那些想要跟踪它的人使用: https://trac.nginx.org/nginx/ticket/1851 https://trac.nginx.org/nginx/ticket/1817
编辑 2:Nginx 团队回应说由于安全原因他们不会支持它(您可以在重复的错误帖子中找到响应),我认为这是由于来自不同来源(如 CDN)的推送?无论如何,我需要这个功能,所以剩下的唯一选择是:
创建自定义补丁或包。
使用其他一些支持它的服务器软件。
如果请求来自支持 webp 的客户端,则在网站代码中手动实现将 .jpg 路径重写为 .jpg.webp 的功能。
(我不放弃:P)
【问题讨论】:
标签: nginx push http2 webp content-negotiation