使用 nginx 阻止 304 Not Modified 请求

使用 nginx 阻止 304 Not Modified 请求

我正在运行 nginx,并且有以下到期阻止:

expires 52w;

然而,当我使用 Google Chrome 开发者工具观察网络流量时,一些资产是从缓存中加载的(200-来自缓存),而大多数资产正在向服务器发出请求(304 未修改)。

如果可能的话,我想从缓存中加载所有资产而不与服务器通信。(200-来自缓存)

我的 nginx 配置需要做哪些更改?

答案1

您正在寻找的是expires max;这设置了一个遥远的未来标头,大多数浏览器都会认为这意味着甚至不必询问资源是否被修改。

请记住,你可以绝不控制任何用户代理将发出的请求,您只能给它指令并希望它听从。这是您能做的最好的事情。

答案2

首先,304 HTTP 状态不包含消息正文,相反,它不应该如规范中所述,还有一些基于缓存验证器的特定条件,请查看 W3C 文档了解更多详细信息。

关于在 Nginx 上启用缓存设置,这是我设置缓存的方式

# all pages or URL patterns that are to be cached go here
location ~* \.do$ {
  expires -1;
}

# allow caching for static assets
location ~* \.(css|js|gif|jpe?g|png|svg)$ {
  expires 2w;
  add_header Pragma public;
  add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}

答案3

您应该参考 HTTP 规范恕我直言;并充分了解缓存背后的机制和 304 的含义,它不会像 200 响应那样传输相同的数据。

就像 Martin 指出的那样,您给出一个“指令”并让它自行执行,但浏览器会检查是否使用缓存副本。此外,您可以添加agemax-age标头,使其保持在max-age高于的水平,age有时甚至可以避免 304。

最后,如果您尝试通过刷新来查看页面上所有这些的效果,您仍可能会因为浏览器发起的请求而收到 304 响应,据我所知,这是您无法真正控制的。

相关内容