我已将 Nginx http/2 服务器推送添加到我的 WordPress 站点选定文件(字体、CSS 和 JS)。它按预期运行。不过,还是存在一个问题。
如果访问者再次导航到我网站上的另一个页面,Nginx 服务器推送同样会失败,即使它们已经缓存在访问者的 Web 浏览器中。每个页面预览 Nginx 都会重新推送每个服务器推送文件。
如果文件已经缓存在访问者设备上,有什么方法可以暂时禁用服务器推送?
答案1
您捕获了 HTTP2/Push 的一个已知问题,这也是它被弃用的原因之一 - Chrome 正在评估是否删除 HTTP2/Push。我建议不要花费大量工程时间来调试它。
https://groups.google.com/a/chromium.org/g/blink-dev/c/K3rYLvmQUBY/m/vOWBKZGoAQAJ
答案2
nginx 中没有直接的机制来选择性地执行推送。
一种方法是仅当客户端未随请求发送 cookie 时才推送资源。
该方法可以按如下方式实现:
在http
关卡中定义一个地图:
map $http_cookie_preloaded $resources {
"visited" "";
default "</style.css>; as=style; rel=preload, </image1.jpg>; as=image; rel=preload";
}
在server
块中:
server {
http2_push_preload on;
add_header Set-Cookie "preloaded=1";
add_header Link $resources;
}
这样,用户在第一次访问时就会获得推送的资源。他们还会获得一个“预加载”的 cookie,从而阻止在后续页面加载时推送。
资源在map
default
映射中指定。