瞎扯淡 HTTP 缓存

olivetree123 · 2019年01月10日 · 最后由 tuliang 回复于 2019年01月10日 · 1427 次阅读

HTTP 的缓存控制实在是让人头晕,今天遇到了点问题就顺便测试了一番。
测试的环境:Nginx 静态站点,获取其中的图片。
浏览器:Safari 12.0 / Chrome 71.0 / Firefox 64
测试内容:max-age / Last-Modified / Etag 这三个 Header 是否起作用。
测试过程:

  1. 测试 max-age
    Nginx 配置如下:

    location / {
        expires 1h;
        etag off;
        if_modified_since off;
        index index.html;
    }
    

    现象:HTTP Response Header 中有 Cache-Control: max-age=3600,但是刷新页面会重新请求并下载文件,返回码都是 200。
    结论:缓存未生效,浏览器每次都会重新请求并重新下载资源。

  2. 测试 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 的方式不对吗?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号