alias与expires必须同处一个location块且正确配置路径与响应头,否则缓存不生效;推荐alias末尾加/,并配合Cache-Control与immutable等指令精准控制缓存策略。

在 Nginx 中,alias 负责把请求路径精准映射到磁盘目录,expires 则负责告诉浏览器这个资源能缓存多久——二者必须在同一 location 块内配合使用,缺一不可。只配 alias 会服务文件但无缓存头;只配 expires 在错误位置则完全不生效。
alias 和 expires 必须同处一个 location 块
expires 指令不会继承,也不能写在 server 或 http 全局块里。它只对当前 location 内最终返回静态文件的分支起作用。
- ✅ 正确:在带
alias的location里直接写expires - ❌ 错误:把
expires放在server块顶层,或放在另一个不匹配静态资源的location中 - ⚠️ 注意:若该
location同时含try_files或proxy_pass,要确保expires作用于命中本地文件的路径分支(例如try_files $uri =404成功返回时)
alias 路径写法影响映射准确性
alias 是“替换”而非“拼接”,末尾斜杠细节决定文件能否被正确定位。
- 推荐写法:
location /static/ { alias /data/assets/; }(location和alias都以/结尾) - 对应请求
/static/js/app.js→ 实际读取/data/assets/js/app.js - 若漏掉
alias末尾的/(如alias /data/assets),Nginx 可能尝试读取/data/assetsjs/app.js,导致 404 - 与
root混用时尤其危险,务必避免在同一配置中交叉使用两者处理同类路径
按资源类型搭配 expires 和 Cache-Control
仅靠 expires 不够,现代浏览器更依赖 Cache-Control。带哈希的静态资源应启用 immutable 来跳过刷新验证。
- 指纹文件(如
app.a1b2c3.js,style.f4e5d6.css):expires 1y;+add_header Cache-Control "public, immutable"; - 普通图片、图标(无哈希):
expires 30d;+add_header Cache-Control "public, max-age=2592000"; - HTML、入口页等动态内容:
expires epoch;或expires -1s;+add_header Cache-Control "no-cache, must-revalidate"; - 注意:
add_header在同一作用域多次出现会覆盖前值,建议合并成一条完整指令
验证是否真正生效
配置后必须检查响应头,不能仅凭语法测试通过就认为成功。
- 执行
sudo nginx -t && sudo nginx -s reload - 用浏览器开发者工具打开 Network 面板,找一个由该
location服务的资源(如/static/logo.png) - 确认响应头中同时存在:
Cache-Control: public, immutable
Expires: [未来某天时间]
Status: 200 (from disk cache)(刷新后显示此状态才说明缓存已起效)


















