核心是分层试探、按需兜底:先查本地静态资源,再交由命名location封装代理、重定向或降级逻辑;支持静态优先+后端兜底、多级静态回退、错误码触发容错降级及哈希资源兜底等多种优雅降级场景。

用 try_files 配合 location 实现优雅降级,核心是“分层试探、按需兜底”:先查本地静态资源,再交由命名 location 做逻辑处理(如代理、重定向、降级页),避免硬编码 rewrite 或盲目 fallback。
静态优先 + 后端兜底(最常用)
适用于前端 SPA 部署或前后端混合站点:
-
try_files $uri $uri/ @backend;—— 先找真实文件或目录,都失败就跳转到@backend -
location @backend { proxy_pass http://app_server; }—— 命名 location 不暴露给外部,只作内部跳转目标 - 注意:
@backend中不能含变量或正则,仅用于封装处理逻辑
多级静态降级(适合内容型网站)
当 URL 路径有层级语义(如博客归档),可逐级回退到更宽泛的索引页:
try_files $uri $uri/index.html /blog/2024/index.html /blog/index.html =404;- 请求
/blog/2024/04/post会依次尝试:
→/blog/2024/04/post(文件)
→/blog/2024/04/post/index.html(目录索引)
→/blog/2024/index.html
→/blog/index.html
→ 最终返回 404
错误码触发降级(后端故障容错)
当 proxy_pass 后端不可用时,用 error_page 捕获并跳转至命名 location:
- 在代理 location 中启用:
proxy_intercept_errors on; - 捕获错误:
error_page 502 503 504 = @degrade;(等号表示保留原状态码) location @degrade { internal; root /usr/share/nginx/html; try_files /degrade.html =404; }- 必须加
internal,防止被直接访问;try_files确保降级页存在才返回
带版本哈希的静态资源兜底
构建产物含内容哈希(如 app.a1b2c3.js),但 CDN 缓存可能滞后或路径未同步:
try_files $uri /static/js/app.js =404;- 先查带哈希的精确路径,找不到就回落到无哈希的通用路径
- 比用
rewrite更轻量,不触发正则匹配开销











