Nginx中expires指令需按资源类型精准配置:HTML禁用缓存(expires -1),JS/CSS等哈希文件设1年强缓存并加immutable,图片按静态/动态区别设置30天或7天,注意location优先级与响应头一致性。

在Nginx中,expires指令用于控制浏览器缓存行为,合理设置能显著减少重复请求、降低服务器压力、提升页面加载速度。但不同资源类型对缓存策略要求差异很大——HTML不该长期缓存,而JS/CSS/图片等静态资源可设较长有效期。下面结合实战场景,说明如何按文件后缀精准配置。
针对HTML文件:禁用或极短缓存
HTML通常是动态生成的(即使由后端模板渲染),内容可能随时变化。若缓存太久,用户可能看到过期页面或无法获取最新功能。
- 推荐统一在
location /或location ~ \.html$中设置:
expires -1;(等效于Cache-Control: no-cache)或expires 0;(触发no-cache并清空Expires头) - 避免使用
expires 1h之类固定值,除非你确认HTML完全静态且更新频率可控 - 若用CDN,还需配合
Cache-Control: no-store或must-revalidate确保边缘节点不缓存
针对JS、CSS、字体等构建产物:强缓存+版本化路径
这类资源通常由构建工具(如Webpack/Vite)自动添加哈希(如app.a1b2c3.js),内容变更即路径变更,适合启用强缓存。
- 匹配常见后缀:
location ~* \.(js|css|woff2?|ttf|eot|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
} -
immutable是关键:告诉浏览器该资源不会更新,无需发条件请求(如If-None-Match),进一步减少往返 - 注意:仅当URL含哈希或时间戳时才启用
immutable,否则会缓存错误版本
针对图片资源:按类型区别对待
图片体积大、复用率高,但更新频率不一。Logo和图标几乎不变,而用户上传的头像或文章配图可能频繁更新。
- 通用静态图(PNG/JPG/GIF):
location ~* \.(png|jpe?g|gif|webp)$ {
expires 30d;
add_header Cache-Control "public";
} - 图标类(favicon.ico、icon.png)可延长至
1y,因路径固定且极少改动 - 用户生成内容(如
/uploads/目录下图片)建议不加expires,或走独立location并设为7d,同时配合后端签名URL或CDN缓存刷新机制
避坑要点:优先级与继承关系
expires不是全局开关,它的生效受location匹配顺序和嵌套层级影响:
- 正则location(
~*)优先级高于前缀location(location /static),但低于精确匹配(location = /index.html) - 若在
server块直接写expires 1h,会被更具体的location块覆盖;反之,未被匹配的请求会继承server级设置 - 测试时用curl验证响应头:
curl -I https://example.com/style.css,检查Cache-Control和Expires是否符合预期 - 不要混用
expires和add_header Cache-Control产生冲突(例如一个设max-age=3600,另一个又写max-age=86400),Nginx以最后执行的为准

















