root和alias仅决定URI到磁盘路径的映射,expires才控制缓存响应头;三者须同处location块内协同生效,且expires仅在静态文件被Nginx直接返回时起作用。

root 和 alias 本身不控制缓存,它们只决定请求 URI 映射到哪个磁盘路径;expires 则负责在响应头中写入 Cache-Control 和 Expires 字段,告诉浏览器能缓存多久。三者必须在同一 location 块里协同生效——路径映射对了,文件才能被正确读取并打上缓存头。
root + expires:拼接路径时注意 URI 完整性
root 是“拼接”逻辑:Nginx 把整个请求 URI(包括 location 前缀)追加到 root 路径后。例如:
-
配置:
root /var/www/html;+location /static/ { } -
请求:
/static/css/main.css -
实际读取路径:
/var/www/html/static/css/main.css
因此,在该 location 块内直接加 expires 即可生效:
location /static/ {
root /var/www/html;
expires 1y;
add_header Cache-Control "public, immutable";
}⚠️注意:如果 root 路径末尾多写了 /(如 root /var/www/html/;),一般不影响,但和 alias 混用时易引发歧义,建议统一不带尾部斜杠。
alias + expires:替换路径要严守斜杠规则
alias 是“替换”逻辑:location 中匹配的部分被完全去掉,换成 alias 后的路径。它对斜杠非常敏感:
-
正确写法:
location /images/ { alias /data/pics/; }→ 请求/images/logo.png对应/data/pics/logo.png -
错误写法:
location /images/ { alias /data/pics; }→ 实际找的是/data/picslogo.png(少斜杠导致粘连)
所以 alias 值末尾强烈建议加 /,且 location 的匹配路径也推荐以 / 结尾。缓存配置必须紧贴 alias 写在同一块内:
location /assets/ {
alias /var/www/dist/;
expires max;
add_header Cache-Control "public, immutable";
}✅适用于带哈希的资源(如 /assets/js/app.8f3a2b.js),长期缓存+immutable 可避免重复验证。
expires 生效的前提是静态文件真被返回了
如果 root 或 alias 配置错误,导致 Nginx 返回 404 或 fallback 到 try_files 的其他分支,expires 就不会起作用——它只作用于最终由 Nginx 直接读取文件并响应的那个环节。
- 检查 Nginx 错误日志,确认没有
open() "/xxx" failed (2: No such file or directory) - 避免把 expires 写在 server 块顶层,它不会自动继承到子 location
- 若 location 内有 proxy_pass 或复杂的 try_files,确保 expires 在真正 serve 静态文件的分支里
按资源类型分层设置缓存时间更合理
不同静态资源变化频率不同,不宜全站统一 expires:
-
不变资源(第三方库、带哈希的 JS/CSS、字体)→
expires max;或expires 1y; -
低频更新资源(业务图片、图标)→
expires 30d; -
可能频繁更新资源(首页 banner 图、运营素材)→
expires 1h;或配合版本号路径
可结合正则 location 分类处理:
location ~* \.(js|css|woff2?)$ {
root /var/www/static;
expires 1y;
add_header Cache-Control "public, immutable";
}
<p>location ~* .(jpg|jpeg|png|gif)$ {
root /var/www/uploads;
expires 7d;
add_header Cache-Control "public";
}


















