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

时间:2017-02-22 20:52:28

标签: php html caching response-headers

我正在使用HTML meta标记来禁用缓存,直到我了解到只有在本地提供文件时这才有效,所以我通过推荐使用标头来禁用缓存,方法是将它放在我的顶部网页:

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">

这阻止了资源被缓存,这是我想要的,但是在阅读了一些之后,似乎可以使用额外的头文件来定位某些文件格式并阻止它们被缓存,这将产生相同的结果作为版本控制,虽然方式不同。

我对此的理解是否正确和/或混合方法是不好的做法?

1 个答案:

答案 0 :(得分:1)

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

  • 请求页面 - 接收包含不缓存指示的响应
  • 解析收到的页面,获取资源的URI(css,js,img等)
  • 发送每项资源的请求 - 接收回复

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

有多种方法可以防止缓存。一个正是您所描述的,即向请求的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>

请注意缓存的想法是双重的:

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

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