高速缓存控制的硬性和快速性规则是什么?


15

坦白:我维护的网站对缓存控制有不同的规则,主要是基于服务器的默认配置,随后是Page SpeedY-Slow Firefox插件的建议以及Google Speed Tracer中的Network Resources视图。Cache-Control设置为私有/公共,具体取决于它们说的是什么,仅当Y-Slow提示有问题并且在为Amazon手动gzip文件压缩时似乎需要Vary-Accept-Encoding时,才会修补ETag的/最后修改的标头CloudFront。

当通读有关不同选项及其所做内容的材料时,似乎存在相互矛盾的信息,有关代理损坏的规则和货物偏爱的配置。上面提到的分析工具提供的任何官方信息都很难访问,因为它单独处理每个主题而不是作为一个统一的策略来处理(因此,没有技术的交叉引用)。

例如,如果速度分析工具旨在帮助缓存,那么将速度分析工具对具有ETag的网站和没有ETag的网站的评级相同就没有意义。

平台不可知的高速缓存控制策略有哪些硬性规则和快速规则?

编辑:

一个链接通过杰夫·阿特伍德的文章中精湛的深入解释缓存。

为了记录在案,这是硬性规定和快速规定:

如果使用GZIP等压缩文件 -使用“ cache-control:private”作为代理可能会将压缩版本返回给不支持该压缩版本的客户端(尽管浏览器缓存将保存以此方式标记的文件)。还请记住包括一个“ Vary:Accept-Encoding”,以表示它是可压缩的。

将Last-Modified与ETag结合使用 -皮带和花括号的用法可同时提供两个验证器,而ETag基于文件内容,而不是仅基于修改时间,同时使用了所有基础。注意: 由于某种原因,AOL的PageTest对ETag采取了彻底解决方案。如果您在多台服务器上使用Apache来承载相同的内容,那么除非您确实使用相同的实时文件系统,否则从FileETag指令(即“ FileETag MTime Size”)中排除隐式声明的inode即可将其从ETag中移除。

尽可能使用“缓存控制:公共” -这意味着即使页面的其余部分需要HTTP身份验证,代理服务器(和浏览器缓存)也将返回您的内容。

Answers:


8

首先,除非您使用的是服务器场/集群,否则请不要像Yahoo所说的那样摆脱ETag。只要同一个文件在未更改的情况下始终返回相同的ETag,那么它是一个非常有用的指令。

至于其他标题,Yahoo的最佳做法建议Expires为静态文件设置一个遥远的标题,以Cache-Control用于动态内容。但是,Cache-control对于静态内容(它们之间几乎没有区别)完全可以。

当您更改缓存的静态文件时,您将需要更改文件名,或在末尾添加一个唯一的参数,例如example.com/styles.css?v=2。但是,最好更改实际的文件名,如下面的注释所述。

顺便说一句,您可以根据自己的喜好编辑YSlow规则,以删除Etag规则并将您自己的域添加为CDN。这篇文章也很不错:Yahoo的问题不是您的问题


在Apache中,通过执行“ FileETag MTime Size”代替默认的ETag是合理的,该默认值在Y-Slow上包括inode(每个FS都是不可靠的)。但是,与Page Speed相比,有关Yahoo最佳实践的建议有点令人困惑。例如,它说仅在动态页面上使用Cache-Control(您也建议过),而Google建议在静态CSS上使用Cache-Control:public,在手动GZipped Amazon Cloudfront文件上使用Cache-Control:private。
Metalshark,2010年

很难知道如何对代理提出建议。Google只是说“有些公共代理有bug ...”,但没有说这有多普遍。它确实建议设置标题Vary: Accept-Encoding,请参见code.google.com/speed/page-speed/docs/caching.html
DisgruntledGoat 2010年

添加查询参数会在某些浏览器中完全禁用该文件的缓存。因此,您可能想使用“更改文件名”方法,例如example.com/style_v2.css
Evgeny 2012年

@Evgeny:哪些浏览器?之前我听说过,但是我从未见过实际上没有缓存文件的浏览器(尤其是如果您具有正确的标题)。
DisgruntledGoat 2012年

实际上,@ DisgruntledGoat经过一番挖掘后似乎是http / 1.0时代的遗物,它实际上是规范的一部分,实际上说用户代理不得缓存具有查询字符串的资产。另一方面,code.google.com/speed/page-speed/docs/caching.html指出,代理(squid <3.0)不会缓存资产,因此不建议使用查询字符串进行缓存清除。
叶夫根尼(Evgeny)2012年

0

更改资源的请求标头以使用缓存对于大多数人来说,可实现缓存的方法是在Web主机/服务器上的.htaccess文件中添加一些代码。

这意味着要在网络主机上转到文件管理器(或您要添加或上传文件的任何位置)。

.htaccess文件控制着您网站的许多重要内容。如果您不熟悉.htaccess文件,请阅读我的.htaccess文件,以获取有关更改之前的知识。

下面的代码告诉浏览器要缓存什么以及“记住”多长时间。它应该添加到您的.htaccess文件的顶部。

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

保存.htaccess文件,然后刷新您的网页。

资料来源:https :
//varvy.com/pagespeed/leverage-browser-caching.html


ExpiresByType我看到的几乎每个指令示例都包含mime类型text/x-javascript-您的服务器是否真的以这种内容类型作为响应?(盲目复制/粘贴IMO的示例。)
怀特先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.