Nginx静态文件未走缓存因宝塔默认未配置缓存头,需在location块中同时添加expires和add_header Cache-Control指令,并注意防盗链配置覆盖、重载Nginx、检查代理截断等问题。

为什么 Nginx 静态文件没走缓存,Expires 始终是 -1?
宝塔默认的 Nginx 配置里,静态资源(如 .js、.css、.png)根本没配缓存头,浏览器每次都会发 GET 请求并收到 200(不是 304),Expires 和 Cache-Control 为空或被覆盖。这不是浏览器问题,是服务端压根没告诉它“能缓存”。
实操建议:
- 进宝塔 → 网站 → 设置 → 配置文件,在
location ~ .*\.(js|css|png|jpg|gif|svg|woff|ttf|eot)$块内手动加缓存指令 - 别只加
expires,必须同时配add_header Cache-Control,否则某些 CDN 或代理可能忽略Expires - 注意:宝塔「网站设置 → 防盗链」开关会自动插入
location规则,可能覆盖你写的缓存配置——关掉防盗链或把它合并到同一location块里
expires 设成 1y 安全吗?哪些文件适合长效缓存?
设成 expires 1y 没问题,但前提是文件名带哈希(比如 app.a1b2c3.js)。否则用户更新代码后,旧缓存还在本地,页面就白屏或错乱。
实操建议:
- 静态资源分两类:带版本/哈希的(放心设 1y)、不带版本的(比如
logo.png、style.css)——这类最多设7d,且上线后得手动清 CDN 或改文件名 - 字体文件(
.woff、.ttf)极少变更,适合expires 1y - HTML 文件永远不要加
expires,必须保持no-cache,否则用户看不到新页面 - 宝塔配置里别写
expires max,有些老旧客户端解析异常,统一用1y或365d
宝塔配置保存后不生效?检查这三处硬性限制
改完配置点保存,curl 一查还是没 Cache-Control,大概率卡在这几个地方:
- 没点「重载配置」按钮(在配置文件编辑页右上角),只保存不重载 = 白改
- Nginx 主配置里
include了其他文件(比如/www/server/panel/vhost/nginx/*.conf),而你的规则写在子配置里,但主配置里已有同类型location且优先级更高——用nginx -T | grep -A5 "location.*\.(js|css)"看实际加载顺序 - 开启了「强制 HTTPS」或「反向代理」,请求被提前截断,缓存头在代理层被清除——先关掉这些功能验证是否生效
验证缓存是否真起作用,别只看响应头
看到 Cache-Control: max-age=31536000 不代表成功。用户真实体验取决于:是否返回 304、CDN 是否回源、本地磁盘缓存是否写入。
实操建议:
- 用 Chrome 开发者工具 → Network → 刷新页面,找一个 JS 文件,看它的
Status是200(从内存/磁盘读)还是304(协商缓存);如果是200且 Size 显示from disk cache,才算落地 - 用
curl -I https://yoursite.com/app.js查响应头,确认Expires和Cache-Control同时存在且值合理 - 改一次文件内容再刷新,如果仍
from disk cache,说明没做哈希 —— 这时候长效缓存就是个坑
长效缓存真正难的不是配置,是构建流程能否稳定输出带哈希的文件名。没这一步,所有 expires 1y 都在埋雷。



















