在站点配置文件(Nginx 站点一般是 vhosts 目录下的 域名.conf)的 server 块里加 expires 指令,静态资源按类型设 30 天到 1 年,HTML 单独设不缓存,改完先 nginx -t 校验再 reload,最后用 curl -I 看响应头确认生效。
小皮面板怎么给小皮面板(Nginx)站点加 expires?
结论:小皮面板本身没有专门的“缓存开关”,浏览器缓存是通过站点 vhost 配置文件里的 Nginx expires 指令实现的。
操作路径有两种,任选一种:面板 → 网站 → 找到站点 → 管理 → 修改 → 配置文件;或直接打开小皮面板安装目录下 vhosts 目录里对应的 你的域名.conf。在 server { } 内部、root 之后加入:
location ~* \.(jpg|jpeg|png|gif|webp|svg|ico|woff|woff2|ttf)$ {
expires 30d;
add_header Cache-Control "public";
}
# CSS / JS:文件带 hash 或版本号时可直接 1 年
location ~* \.(css|js)$ {
expires 365d;
add_header Cache-Control "public";
}
# HTML 不缓存,保证内容更新即时可见
location ~* \.(html|htm)$ {
expires -1;
}
expires 30d 的作用是同时输出 Expires 和 Cache-Control: max-age=2592000(30 天 = 2592000 秒);expires -1 表示把 Expires 设为过去时间,等价于 no-cache。
注意两点:如果某个 location 里已经写了 add_header,父级 server 块的 add_header 不会继承,要在这个 location 里补全;不要在同一个 location 里既写 expires 又手写 add_header Cache-Control,否则响应头里会出现两条 Cache-Control。
静态资源过期时间设多久才合理?
结论:按“文件内容是否会变”来决定,而不是按文件类型一刀切——文件名带指纹(如 app.9f3c1a.css)的设 1 年,文件名固定的设 1 天到 7 天。
推荐取值:
- 带 hash/版本号的 CSS、JS:
expires 365d,配合 immutable 更佳
- 不带指纹的 CSS、JS:
expires 7d
- 图片、图标、字体:
expires 30d
- 用户上传的附件(可能被替换同名文件):
expires 7d
- HTML、接口 JSON、后台页面:
expires -1 或 no-cache
Apache 环境下怎么配置?
结论:小皮面板切换成 Apache 后,用 mod_expires 配置,写在站点 vhosts 的 httpd-vhosts.conf 或站点根目录的 .htaccess 里。
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
access plus 30 days 表示从用户访问时刻起算 30 天。改完重启 Apache 生效。
配置完成后怎么验证有没有生效?
结论:用 curl -I 或浏览器 F12 的 Network 面板看响应头里的 Cache-Control 和 Expires,没有这两个头就是没生效。
curl -I https://你的域名/static/app.css
期望看到 Cache-Control: max-age=31536000 和一条 Expires 日期。也可以用浏览器开发者工具打开目标页面,在 Network 里点开任意一张图片,看 Response Headers。
为什么加了 expires 还是不生效?
结论:九成是没 reload 或规则顺序被覆盖。
排查顺序:
- 改完配置文件必须重启 Nginx(面板上点重启,或命令行
nginx -t && nginx -s reload);nginx -t 报错时不会生效,先修语法
- 面板的伪静态规则、其它
location 匹配优先级更高,会盖掉你写的规则,把静态资源 location 放在靠前位置
- 文件本身就没走你的规则(比如走了 PHP 动态输出、或经 CDN 回源),检查一下是不是 CDN 层覆盖了缓存头
- HTML 如果被设了长缓存,用户会长期看到旧页面,这种“改了不生效”的问题把 HTML 设成
expires -1 即可
一句话收尾:小皮面板的浏览器缓存配置本质就是改站点 vhost 的 expires 指令——静态资源按是否带指纹给 30 天到 1 年,HTML 一律不缓存,改完 nginx -t 校验、reload,再用 curl -I 验证响应头,这三步都做到就不会出现“配了没效果”的情况。