浏览器缓存需按资源类型差异化配置cache-control头:带哈希的静态资源设public,max-age=31536000,immutable;普通静态资源设public,max-age=2592000,must-revalidate;html设no-cache,must-revalidate;api等动态接口设no-store,no-cache,must-revalidate,max-age=0。

浏览器缓存的核心是让 Nginx 在响应中正确设置 Cache-Control 头,而不是依赖 expires 或笼统配置。关键在于按资源类型差异化控制:谁可以缓、缓多久、要不要验证。
带哈希指纹的静态资源(如 app.a1b2c3.js)
这类文件内容不变则 URL 不变,适合长期强缓存且跳过验证:
- 用正则精准匹配:
location ~* \.[a-f0-9]{8,}\.(js|css|png|jpg|webp|woff2|svg)$ - 设置响应头:
add_header Cache-Control "public, max-age=31536000, immutable" always; -
always确保覆盖 PHP、FastCGI 或上游代理返回的旧头 - 可选加
expires 1y;兼容 HTTP/1.0 客户端
普通静态资源(如 logo.png、font.woff2)
未带哈希、更新不可控,需保留验证能力,避免用户卡在旧版本:
- 按后缀匹配:
location ~* \.(png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$ - 设 30 天可验证缓存:
add_header Cache-Control "public, max-age=2592000, must-revalidate" always; - 不加
immutable,保留 ETag / Last-Modified 协商机制 - 建议关闭访问日志:
access_log off;减少 I/O 开销
HTML 入口文件(如 index.html)
它是页面骨架,每次部署都可能变化,强缓存极易导致白屏或 JS/CSS 加载失败:
- 匹配所有 HTML:
location ~* \.html?$ - 禁用强缓存,启用协商验证:
add_header Cache-Control "no-cache, must-revalidate" always; - 根路径也要覆盖:
location = / { try_files /index.html =404; add_header Cache-Control "no-cache"; } - 确保
ETag on;(Nginx 默认开启),配合后端返回 304 节省传输
动态与敏感接口(如 /api/、/user/、.php)
涉及用户数据、表单提交或状态变更,必须杜绝任何缓存痕迹:
- 路径匹配:
location ^~ /api/、location ^~ /user/、location ~* \.(php|json)$ - 彻底禁用缓存:
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; -
no-store比no-cache更严格,禁止浏览器和 CDN 写入磁盘 - 注意:若响应中含
Set-Cookie,默认会阻止缓存,无需额外处理
配置后务必验证生效:用 curl -I https://yoursite.com/static/app.abc123.js 查看响应头,确认含 Cache-Control: public, max-age=31536000, immutable;对 HTML 则应为 no-cache。若未生效,检查 location 优先级是否被更高层级块覆盖,或 upstream 是否已设冲突头未被 always 覆盖。











