HTTP 的缓存控制实在是让人头晕,今天遇到了点问题就顺便测试了一番。
测试的环境:Nginx 静态站点,获取其中的图片。
浏览器:Safari 12.0 / Chrome 71.0 / Firefox 64
测试内容:max-age / Last-Modified / Etag 这三个 Header 是否起作用。
测试过程:
测试 max-age
Nginx 配置如下:
location / {
expires 1h;
etag off;
if_modified_since off;
index index.html;
}
现象:HTTP Response Header 中有 Cache-Control: max-age=3600,但是刷新页面会重新请求并下载文件,返回码都是 200。
结论:缓存未生效,浏览器每次都会重新请求并重新下载资源。
测试 Etag
Nginx 配置如下:
location / {
expires off;
etag on;
if_modified_since off;
index index.html;
}
结论:刷新页面 304,不会重新下载资源。
if_modified_since(对应 HTTP Header 中的 Last-Modified)和 Etag 一样,也会使得请求 304。
综上,max-age 不起作用,Etag 和 Last-Modified 起作用,但是这两个 Header 的功能是一样的,二者用其一即可。
那么问题来了,各种资料都说 max-age 是有效的,难道是我使用 max-age 的方式不对吗?