常识来了
白蓝主题五 · 清爽阅读
首页  > 网络排错

cache-control怎么设置

你有没有遇到过这种情况:改完网页,刷新却发现页面还是老样子?明明代码已经更新了,用户看到的却是旧内容。这时候问题很可能出在缓存上,而关键就是 Cache-Control 这个HTTP头。

什么是 Cache-Control

Cache-Control 是HTTP协议中用来控制浏览器和中间代理如何缓存资源的字段。它决定了一个文件能被缓存多久、是否允许缓存、谁可以缓存等行为。设置得当,能让网站加载更快;设置不当,就会出现“改了不生效”或者“总是重新下载”的问题。

常见指令说明

比如你有一个静态图片 logo.png,希望浏览器长期缓存它,可以这样设置:

Cache-Control: max-age=31536000, public

这里 max-age=31536000 表示缓存有效期是一年(单位是秒),public 表示任何中间代理都可以缓存。

但如果是用户登录后的个人页面,内容敏感且经常变化,就应该禁止缓存:

Cache-Control: no-cache, no-store

其中 no-cache 表示使用前必须向服务器验证是否过期,no-store 是最严格的,表示完全不允许存储副本。

实际配置方法

如果你用的是Nginx服务器,在配置文件里加上这一行就行:

location /static/ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

这样所有放在 /static/ 路径下的资源都会带上一年的有效期和公共可缓存策略。

如果是Apache服务器,可以在 .htaccess 文件中写:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
</IfModule>

虽然这里用了 Expires,但最终生成的响应头还是会包含对应的 Cache-Control 指令。

开发调试时的小技巧

前端本地开发时,经常希望每次都能拿到最新文件,可以临时加:

Cache-Control: no-cache

这样浏览器每次都会发请求问服务器有没有更新,避免自己被缓存坑了还找不到原因。

反过来,上线后发现用户看不到新版本,可能就是因为静态资源被缓存得太久。解决办法之一是在文件名后加版本号或哈希,比如 app.a1b2c3.js,配合长期缓存策略,实现“既能高效缓存,又能强制更新”的效果。

注意优先级

多个缓存指令同时存在时,浏览器会按最严格的规则执行。比如同时有 max-age=3600no-cache,那 no-cache 会起主导作用,即使时间没到也要先校验。

另外,CDN节点也会遵循 Cache-Control 设置。如果你的资源通过CDN分发,设置 max-age 太长,更新时就得手动清缓存,不然全球节点都还在吐旧内容。