2017-02-22 192 views
0

我用的是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"> 

已停止被缓存,这就是我想要的东西,但资源,那么阅读多一些看来附加头可用于后定位某些文件格式并阻止它们被缓存,这会产生与版本控制相同的结果,尽管方式不同。

难道我这是正确的和/或混合方法是不好的做法的理解?

+0

也许你正在缓存在Web服务器级别?在IIS中你有这个选项,几乎肯定其他人 – Oscar

+2

for appache:http://httpd.apache.org/docs/current/mod/mod_expires.html – nogad

回答

1

你的观察和理解是正确的。例如,当您在php中设置缓存标题时,它们仅对该页有效。看着它从一个浏览器的点:

  • 请求页面 - 收到回应与说明不缓存它
  • 解析接收的页面,获取资源(CSS,JS,IMG等)
  • 的URI的
  • 发送请求这些资源 - 接收响应

如果在这最后的响应,没有头告诉浏览器不缓存他们,那么他们将被按照标准规则缓存。

有不同的方法,以防止缓存。一个就是你描述的内容,即为请求的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> 

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

  • 使客户能够得到回应通过使用资源
  • 降低服务器上的负载以前下载的本地副本更快具有服务于较少的反应

所以千万要caref ul关闭缓存。如果您严重低估了您需要处理的请求数量,您可能(在极端情况下)最终会杀死您的服务器。

+0

谢谢你浏览器的POV,这让我很清楚。我不知道为什么我认为最初的指令不缓存会渗透到页面中的所有内容,但现在我明白了! – Slime

+1

只是即使你这样做,这些文件仍然可以缓存在不同的位置,如你的ISP。 – nogad

+0

@nogad正确。一些代理可能会忽略甚至剥离缓存标题。 –