禁用页面缓存不会禁用缓存资源?

Disabling page cache doesn't disable resources from being cached?

我一直在使用 HTML meta 标签来禁用缓存,直到我了解到这仅在文件在本地提供时才有效,所以我通过推荐使用 [=24] 禁用了缓存=] 将其放在我的页面顶部:

header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");

我找不到答案的问题,问这个问题可能很愚蠢,但这也不会禁用缓存资源,不是吗?我在我的开发人员工具中查看网络选项卡,发现页面每次都在加载新内容,但是 CSS 和 Javascript 等资源仍在从缓存中加载,这让我相信阻止页面缓存并不意味着阻止页面资源被缓存,但我不知道这是否真的如此。所以我所做的是像这样向资源添加一些版本控制:

<link rel="stylesheet" href="css/style.css?version=1">

这阻止了资源被缓存,这正是我想要的,但在阅读更多内容后,似乎额外的 headers 可用于定位某些文件格式并阻止它们被缓存, 这将产生与版本控制相同的结果,尽管方式不同。

我的理解是否正确and/or混合方法是不是不好的做法?

您的观察和理解是正确的。例如,当您在 php 中设置缓存 headers 时,它们仅对该页面有效。从浏览器的角度来看:

  • 请求页面 - 接收带有不缓存它的指令的响应
  • 解析接收到的页面,获取资源的URI(css、js、img等)
  • 为每个资源发送请求 - 接收响应

如果在最后一个响应中没有 headers 告诉浏览器不要缓存它们,那么它们将按照标准规则进行缓存。

有多种方法可以防止缓存。一个正是您所描述的,即向请求的 URI 添加一个不断变化的参数 - 这样,每次请求它时,都会使用不同的参数请求它。它仍然会被缓存,但是下一个请求不会匹配这个请求并且不会使用缓存。

另一个涉及更改 Web 服务器的配置,以指示不应缓存特定类型的资源(文件名、扩展名、内容类型等)。例如,Apache 配置中的以下内容表明任何文件都不应发生缓存:

<Files *>
    Header set Cache-Control: "private, pre-check=0, post-check=0, max-age=0"
    Header set Expires: 0
    Header set Pragma: no-cache
</Files>

注意缓存的思路是two-fold:

  • 允许客户端使用先前下载的资源本地副本更快地获得响应
  • 通过提供更少的响应来降低服务器的负载

因此请小心关闭缓存。如果您严重低估了需要处理的请求数量,您可能(在极端情况下)最终杀死您的服务器。