困扰了我好久,看了 YSlow 的文档,也看了好多网站优化的书,按照书上的说法,加了 expires 和 cache-control 头,静态文件被缓存后,浏览器就不会再次发送请求了。
可是我看 apache 日志,仍然是有请求发到服务器,apache 发送 304 响应头。虽然起到了缓存的作用,但我希望是完全的客户端缓存,也就是说浏览器根本不会向服务器发请求询问。
今天又 google 了下,恍然大悟,原来是浏览器加载页面的策略不同:按刷新按钮与在地址栏输入网址按回车分别代表不同的动作。
地址栏输入,浏览器会优先使用缓存,如果图片文件缓存时设置了 expires ,那么在有效期内,浏览器不向服务端发任何请求,这样速度最快。
按刷新按钮,尽管本地有缓存,浏览器也会向服务器发一个询问请求,如果服务器端文件没有改变,则会返回一个 304 的相应头,告诉浏览器可以使用本地缓存,否则就返回新的文件。
这就解释了我之前遇到的问题。我配置了 Apache 后,每次按 F5 刷新页面,同时观察日志,总是有浏览器请求,总是返回 304 响应。
今天我又试了下,每次都在地址栏按回车,这回只有 html 的请求,图片都使用了本地的缓存。
土了一把……
ExpiresActive On
ExpiresDefault “access plus 1 month”