[英]how to use control-cache headers?
我下载了适用于Google chrome的Google速度跟踪器,以了解我的网站在性能方面的表现如何,它告诉我需要为某些文件(例如我的style.css,图片等)启用缓存。
我读过下面的php代码应该告诉浏览器缓存html内容。 我写了一个快速的php页面,上面有几张图片,并将下面的代码粘贴在顶部(在发送标题之前)以测试其工作方式。
Header("Cache-Control: public, max-age=3600, must-revalidate");
当我回到速度追踪器的分析中时,它说...
来自缓存的摘要 :false
请求标头语法:无缓存高速缓存控制:max-age = 0
但在“ 响应标头”下 ...缓存控制:public,max-age = 3600,必须重新验证(正是我指定的内容)
我有点困惑,怎么回事...? 当它从缓存中说出:false表示从服务器缓存而不是从客户端缓存吗?
关键是必须重新验证 :这意味着,客户端正在询问服务器文件是否已更改。 如果您不处理这种情况,浏览器将获取一个新副本。
阅读Mark Nottingham出色的缓存教程以获取更多信息。 作为PHP实现的示例,您可以使用我的代码 。
查看$_SERVER['HTTP_IF_NONE_MATCH']
和$_SERVER['HTTP_IF_MODIFIED_SINCE']
以验证客户端。 并且请注意,两个标头都可能包含恶意代码。 ;)
当它从缓存中说出: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>
我对这个工具不熟悉,但是,直到任何浏览器都使用缓存头获取内容后,它才能够对其进行缓存。 看来您的服务器正在发送回预期的标头,并且该页面应该由浏览器缓存-您的浏览器现在应该在其缓存中具有副本。 如果您尝试再次获取同一页面,则将从缓存而不是原始服务器获取该页面(假定1小时的时限尚未过期)。
请注意,某些浏览器会将刷新请求解释为显式请求,以忽略缓存并再次获取页面-尝试通过链接而不是点击刷新按钮来访问它。
C。
您需要了解这些Cache-Control标头字段指令的实际含义:
public
:
指示该响应可以被任何缓存所缓存,即使它通常是不可缓存的或仅可在非共享缓存中缓存的。 (有关其他详细信息,另请参见授权,第14.8节 。)
max-age=3600
指定响应在3600秒内是新鲜的:
当缓存响应中存在max-age cache-control指令时,如果响应的当前年龄大于对该资源的新请求时给定的年龄值(以秒为单位),则该响应为过时的。 响应上的max-age指令表示该响应是可缓存的(即“公共”),除非还存在其他一些限制性更强的缓存指令。
must-revalidate
指定高速缓存必须在过期后重新验证高速缓存的响应,然后才能使用该高速缓存的响应来满足请求:
当缓存接收到的响应中存在must-revalidate指令时,该缓存在过期之前将不能使用该条目来响应后续请求,而不必先通过原始服务器对其进行验证,则该缓存不得使用该条目。 (也就是说,如果仅基于原始服务器的Expires或max-age值,缓存的响应是陈旧的,则缓存每次都必须进行端到端重新验证。)[…]服务器应发送必须验证的指令当且仅当未能重新验证实体上的请求会导致不正确的操作,例如默默地未执行的金融交易时。
现在,这就是这些指令的预期含义。
但是与往常一样,现实有所不同:尤其是必须重新验证并不能解释为仅在缓存响应失效后才重新验证缓存的响应,而是必须在每个后续请求中重新验证它或根本不缓存它(这可能就是为什么它在后续请求中发送Cache-Control: max-age=0
的原因。
“ From Cache:false”似乎表明响应不是来自缓存,而是直接来自服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.