静态资源缓存应设为浏览器缓存而非Nginx缓存,因.js/.css/.png等文件发布后极少变动,浏览器缓存30天可省90%请求;宝塔启用“静态文件缓存”即自动注入expires指令,生成标准Cache-Control和Expires头。

静态资源缓存为什么必须设成「浏览器缓存」而不是 Nginx 缓存?
因为 .js、.css、.png 这类文件一旦发布就极少变动,让浏览器自己存 7 天或 30 天,能直接省掉 90% 以上的请求,服务器连连接都不用建。而用 fastcgi_cache 或 proxy_cache 去缓这类资源,反而多绕一层、占内存、还容易因 Cache-Control 冲突失效。
宝塔里最省事的方式就是打开「启用静态文件缓存」——它背后自动注入的是 expires 指令,生成标准的 Cache-Control: max-age=2592000 和 Expires 响应头,兼容所有现代浏览器。
- 进站点设置 → 找到「伪静态」标签页下方,勾选「启用静态文件缓存」
- 下拉选「30 天」(推荐),别选「7 天」——很多前端构建工具(如 Webpack)输出的文件名自带 hash,改了内容就会换 URL,所以缓存久点完全没问题
- 不需要重启 Nginx,保存即生效;刷新任意一个
.js文件,响应头里能看到Cache-Control和Expires
为什么改了缓存时间,Chrome DevTools 里还是显示「from disk cache」或「from memory cache」?
这是正常现象,不是没生效。「from disk cache」说明浏览器真按你设的时间存了,而且这次是复用本地副本;「from memory cache」是更激进的短期复用(进程级),不影响过期逻辑。真正要验证是否生效,得看响应头,而不是控制台的“Size”列。
- 打开 Chrome DevTools → Network 标签 → 刷新页面 → 点一个
.css文件 → 查看 Response Headers 里的Cache-Control和Expires - 如果看到
max-age=2592000(30 天)且Expires是未来时间,说明设置成功 - 如果仍是
no-cache或max-age=0,大概率是 PHP 脚本自己输出了冲突头(比如 WordPress 插件或主题强行加了header('Cache-Control: no-cache')),这种会覆盖 Nginx 的expires
想让某些静态资源不缓存(比如 favicon.ico 或调试用的 main.js),怎么排除?
宝塔面板的「启用静态文件缓存」是全量开关,没法按后缀或路径精细控制。真有例外需求,就得手动写 Nginx 配置,用 location 块覆盖默认行为。
- 进站点设置 → 「配置文件」→ 在
server { }块里,location ~ .*\.(js|css|png|jpg|gif|jpeg|bmp|webp|ico|svg|woff|woff2|ttf|eot)$这类规则上方,插入特例:
location = /favicon.ico {
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
}
/static/main.js,也可以加类似规则:location ^~ /static/main.js { expires -1; }
location = 最精确,优先于正则;所以把例外规则写在通用静态规则之前才有效CDN 场景下,浏览器缓存和 CDN 缓存谁起作用?
两者都起作用,但层级不同:浏览器缓存是最后一道,CDN 缓存是中间代理层。如果你开了宝塔的「静态文件缓存」,CDN 回源拿到的响应本身就带 Cache-Control,它会照着这个时间缓存;用户再请求时,CDN 直接返回,根本不会压到你的服务器。
- CDN 不会无视你设的
expires,但部分 CDN(如腾讯云、又拍云)允许在控制台强制覆盖缓存时间,这时以 CDN 设置为准 - 关键点:确保你的静态资源走的是独立子域名(如
static.example.com),且该站点在宝塔中设为「纯静态」——这样 CDN 回源时不会触发 PHP,也不会被 Cookie 或登录态污染缓存 - 如果发现 CDN 总是回源,先检查宝塔静态站点的响应头有没有
Set-Cookie或Vary: Cookie,有就得在 Nginx 配置里加proxy_hide_header Set-Cookie;(反向代理场景)或确认没开任何 PHP 功能
缓存时间设长很安全,前提是静态资源 URL 本身带版本标识(hash 或时间戳)。最容易被忽略的,是那些没走构建流程的手动上传文件——比如直接 FTP 传了个 style.css,然后靠改内容来更新,这种就必须设短,或者干脆不用浏览器缓存。










