try_files 不直接回源,仅检查本地文件并内部重定向;需配合 error_page 和 proxy_pass 实现回源,其作用是优先服务本地资源,未命中时跳转至命名 location 执行代理。

try_files 本身不直接实现“回源转发”,它只做本地文件系统检查和内部重定向。所谓静态资源回源(比如从 CDN 失败后切到备用源或本地),需要配合 error_page 和 proxy_pass 实现,而 try_files 可以在其中承担“先查本地、再触发回源”的判断角色——即:优先服务本地缓存或磁盘资源,未命中时才交由 error_page 跳转至代理逻辑。
本地存在就返回,否则触发回源流程
典型做法是用 try_files 检查本地路径(如 /cache/$uri),命中则直接返回;不命中就跳转到命名 location,在那里发起 proxy_pass 回源:
- location /static/ {
- try_files /cache$uri $uri @origin;
- expires 1y;
- add_header Cache-Control "public, immutable";
- }
- location @origin {
- proxy_pass https://origin-primary.example.com;
- proxy_set_header Host $host;
- proxy_intercept_errors on;
- error_page 502 503 504 = @backup;
- }
- location @backup {
- proxy_pass https://origin-backup.example.com;
- proxy_set_header Host $host;
- }
这里 /cache$uri 是第一优先级(本地 SSD 缓存),$uri 是第二优先级(原始构建产物目录),都失败才进 @origin ——这个命名 location 才真正负责网络回源。
结合 root/alias 确保路径拼接正确
若静态资源放在子目录(如 /var/www/assets),需明确设置 root,避免 $uri 拼错:
- root /var/www;
- location /static/ {
- # 请求 /static/js/app.js → 查找 /var/www/static/js/app.js
- try_files $uri @cdn_fallback;
- }
用 alias 时要注意:alias 会替换整个 location 匹配部分,$uri 不含前缀。例如 alias /data/static/; 配合 location /static/,请求 /static/logo.png 实际查的是 /data/static/logo.png —— 这个细节错一点,$uri 就永远找不到文件。
避免把 try_files 当 proxy_pass 用
常见错误是写成这样:
- try_files $uri http://origin.example.com/$uri; # ❌ 语法错误,Nginx 拒绝加载
正确方式始终是:try_files 只管“本地有没有”,最后一项必须是 URI(/xxx)或 @named_location;网络转发职责完全交给 proxy_pass 所在的 location 块。
容灾兜底:三级 fallback 示例
可扩展为“本地缓存 → 主源回源 → 备源回源 → 本地降级页”:
- try_files /cache$uri /dist$uri @primary;
- location @primary {
- proxy_pass https://primary/;
- proxy_intercept_errors on;
- error_page 502 503 504 = @secondary;
- }
- location @secondary {
- proxy_pass https://secondary/;
- error_page 502 503 504 = /offline.html;
- }
其中 /offline.html 是预置在 root 下的静态降级页,属于最终保障,也由 try_files 的“最后一环”机制自然承接。


















