命名 location 以 @name 定义,仅作内部跳转目标;try_files 按序检查文件/目录,最后可触发 @name 实现优雅降级,如 SPA 路由或 API 回退。
Nginx 的
和命名
配合使用,是处理静态资源 fallback、多级路径映射和优雅降级的关键技巧。核心在于:命名 location 不参与常规匹配,只作为内部跳转目标;而
可以主动触发这种跳转,从而实现比普通正则 location 更可控的路径重定向逻辑。
理解命名 location 的作用机制
命名 location 以
形式定义,它不会被请求 URI 直接匹配,只能通过
、
或
内部跳转调用。它的优势是完全隔离匹配逻辑,避免干扰主 location 的优先级判断。
例如:
location @fallback {root /var/www/static;try_files /404.html =404;}
用 try_files 触发命名 location 的典型模式
的每个参数按顺序检查:先查文件,再查目录,最后可指定一个 URI(含命名 location)作为兜底。当所有前面的路径都不存在时,Nginx 会发起一次内部重定向到该 URI —— 若是
,就进入对应命名块。
常见组合方式:
:先找真实文件或目录,找不到就进 React 路由入口(如 SPA 的 index.html)
:静态资源存在则直接返回,否则交由后端 API 处理
:旧路径不存在时,跳转到兼容逻辑(比如加前缀、改扩展名)
实现多层静态路径 fallback(带条件)
单个
行最多支持一个命名 location,但可通过嵌套命名 location 实现多步决策。例如:按环境变量或请求头选择不同根目录。
示例:优先尝试带版本号的静态资源,失败后降级到无版本路径,再失败则进兜底页:
location /static/ {alias /opt/app/assets/;try_files $uri @versioned;}location @versioned {# 提取原始请求中的文件名if ($request_uri ~ ^/static/(.+)$) {set $base $1;}try_files /v2/$base /v1/$base @notfound;}location @notfound {return 404 "Static asset not found";}
注意边界与常见陷阱
命名 location 中不能再用
跳回普通 location(会报错“rewrite or internal redirection cycle”),必须确保跳转链终止于文件服务、代理或明确响应。
关键细节:
后的命名 location 前不能加斜杠,写成
,不是
在命名 location 中使用
时,路径拼接基于完整 URI;用
则需注意截断逻辑,通常更推荐
若配合
指令,要明确它只对
形式生效,命名 location 中需显式写出文件名
try_fileslocationtry_files@nameerror_pagetry_filesrewrite ... lasttry_files@nametry_files $uri $uri/ @reacttry_files $uri @proxy_apitry_files $uri @legacy_redirecttry_filestry_filestry_files@name/@namerootaliasrootindex$uri/