如何使用控制缓存头?

时间:2010-04-07 17:52:46

标签: php caching header

我为Google Chrome浏览器下载了Google速度跟踪器,以了解我的网站在性能方面的表现如何,它告诉我需要为某些文件启用缓存,例如我的style.css,图片等。

我已经读过下面的php代码应该告诉浏览器缓存html内容。我写了一个快速的php页面,上面有几张图片,并将下面的代码放在顶部(在发送标题之前),以测试它是如何工作的。

Header("Cache-Control: public, max-age=3600, must-revalidate");

当我回到速度追踪者的分析时,它说......

摘要 来自缓存:false

请求标题 Pragma:没有缓存 缓存控制:max-age = 0

但在响应标题下... Cache-Control:public,max-age = 3600,必须重新验证(正是我指定的)

我有点困惑,发生了什么......?当它从缓存中说:false是否意味着从服务器缓存而不是客户端的缓存?

4 个答案:

答案 0 :(得分:4)

密钥是必须重新验证:这意味着,客户端询问服务器文件是否已更改。如果您不处理这种情况,浏览器将获取新副本。

阅读Mark Nottingham’s fantastic Caching Tutorial了解详情。 作为PHP实现的示例,您可以使用my code

查看$_SERVER['HTTP_IF_NONE_MATCH']$_SERVER['HTTP_IF_MODIFIED_SINCE']以验证客户端。请注意,两个标头可能都包含恶意代码。 ;)

答案 1 :(得分:0)

  

从缓存中说出来时:false确实如此   这意味着从服务器缓存和   不是客户的缓存?

^这是指客户端缓存。

以这种方式设置缓存将涵盖您的PHP文件,但您需要实现服务器端的其他内容来缓存您的图像,CSS,脚本等。这可以使用.htaccess来完成,如果您的服务器支持它。

例如,这就是我在几个网站的.htaccess文件中使用的内容。

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$">
  Header set Expires "Thu, 15 Apr 2012 20:00:00 GMT"
  Header unset ETag
  FileETag None
</FilesMatch>

答案 2 :(得分:0)

我不熟悉这个工具,但是在任何浏览器使用缓存标头获取内容之前,它都无法缓存它。您的服务器似乎正在发回预期的标头,浏览器应该缓存该页面 - 您的浏览器应该现在在其缓存中有一个副本。如果您尝试再次获取同一页 ,那么它将从缓存而不是原始服务器获取(假设1小时时间限制尚未过期)。

请注意,某些浏览器会将刷新请求解释为忽略缓存并再次获取页面的显式请求 - 尝试通过链接访问它而不是点击刷新按钮。

下进行。

答案 3 :(得分:0)

您需要了解这些Cache-Control header field指令的实际含义:

  • <强> public

      

    表示任何缓存都可以缓存响应,即使它通常只能在非共享缓存中进行非缓存或缓存。 (有关其他详细信息,另请参阅Authorization, section 14.8。)

  • max-age=3600 指定响应新鲜3600秒:

      

    当缓存响应中存在max-age cache-control指令时,如果当前年龄大于新资源请求时给定的年龄值(以秒为单位),则响应过时。响应的max-age指令意味着响应是可缓存的(即“public”),除非还存在其他更严格的缓存指令。

  • must-revalidate 指定在使用缓存的响应来满足请求之前缓存必须重新验证缓存的响应:

      

    当缓存接收到的响应中存在must-revalidate指令时,该缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它。 (即,如果仅基于源服务器的Expires或max-age值,缓存的响应是陈旧的,则缓存必须每次都进行端到端的重新验证。)[...]服务器应该发送必须重新验证的指令当且仅当未能重新验证实体上的请求可能导致不正确的操作,例如无声的未执行的金融交易。

现在这是这些指令的意图。

但与往常一样,现实情况略有不同:特别是必须重新验证不会被解释为仅在缓存的响应过时后重新验证它,而是必须在每个后续请求中重新验证它或者根本不能缓存它(这可能是它在后续请求中发送Cache-Control: max-age=0的原因。)

“From Cache:false”似乎表明响应不是来自缓存,而是直接来自服务器。