可通过location嵌套实现静态资源高效缓存与动态请求安全转发:以路径隔离为基础,用alias统一处理静态路径,嵌套正则匹配不同后缀并设置差异化expires;动态请求通过try_files优先文件查找后回源,避免if误判和root/alias混用导致的404;上线后需验证响应头与状态码是否符合预期。

可以通过 location 嵌套,在同一个 server 块里既高效缓存静态资源,又安全转发动态请求,核心在于路径隔离、匹配优先级和作用域控制。
用嵌套 location 区分文件类型并设置不同缓存时长
在主静态路径 location 内部,再定义子 location 匹配具体后缀,避免所有静态资源共用一个过期时间:
- /static/ 作为入口,统一指定 alias 和基础缓存策略
- 内部嵌套 ~* \.(css|js)$,单独设为
expires 7d; - 再嵌套 ~* \.(jpg|png|gif)$,设为
expires 90d; - 子 location 中的
expires会覆盖外层,且只对匹配到的请求生效
确保动态请求不被静态规则拦截
静态 location 必须明确限定路径前缀(如 /static/、/images/),不能用泛匹配覆盖全部请求:
- 推荐写法:
location / { try_files $uri $uri/ @backend; },先查文件是否存在,不存在则跳转到后端 - 避免用
if (!-e $request_filename)做判断,它在 location 中行为受限,易出错 - 注意正则 location(如
~ \.html$)可能意外匹配 API 路径(如/api/v1/user.html),需加路径前缀约束
统一使用 alias 避免 root 拼接歧义
嵌套中路径解析容易混乱,建议静态资源一律用 alias:
-
location /static/ { alias /var/www/assets/; }→ 请求/static/js/app.js实际找/var/www/assets/js/app.js - 若改用
root,同样请求会变成找/var/www/static/js/app.js,多了一层目录拼接 - 混用
root和alias容易导致 404,尤其在嵌套层级变深时
验证响应头与转发行为是否符合预期
上线后必须检查真实响应,确认逻辑落地:
- 访问
/static/css/main.css,响应头应含Cache-Control: max-age=604800 - 访问
/static/images/logo.png,应返回Cache-Control: max-age=7776000 - 访问
/api/users,状态码应为 200 且响应来自后端,Header 中无缓存头 - 可配合
curl -I或浏览器开发者工具 Network 面板快速验证










