location必须嵌套在server块内,不能独立存在或置于http顶层;其核心作用是依据URI路径精准分发请求,按=、^~、~*、普通前缀优先级匹配,顺序错误将导致404/500。

Location路由匹配区块必须写在 server 块内部,不能独立存在或放在 http 块顶层。它的核心作用是根据请求 URI 的路径部分做精准分发,匹配逻辑有严格优先级,写错位置或顺序会导致规则失效甚至 404/500。
location 必须嵌套在 server 块中
这是硬性结构要求。Nginx 配置是层级化的:
- http 块:全局 HTTP 设置(mime 类型、日志格式、gzip 等)
- server 块:定义一个虚拟主机(监听端口 + server_name),一个 http 块可含多个 server
- location 块:只能出现在 server 块(或另一个 location 块)内,用于细化该 server 下的路径路由
错误示例(location 写在 http 层):
❌ 错误http {
include mime.types;
location /api/ { proxy_pass http://backend; } # ❌ 这里不合法,Nginx 启动会报错
}正确写法:
✅ 正确http {
include mime.types;
server {
listen 80;
server_name example.com;
location /api/ { proxy_pass http://backend; } # ✅ 在 server 内,合法
location /static/ { root /data/www; }
}
}一个 server 中可以配置多个 location,但顺序影响行为
多个 location 不是“并列生效”,而是按匹配优先级择一执行。Nginx 不会遍历所有,只选“最匹配”的一个。常见组合示例:
server {
listen 80;
server_name app.example.com;
<pre class='brush:php;toolbar:false;'>location = /health { return 200 "OK"; } # ① 精确匹配,最高优先级
location ^~ /static/ { root /var/www/assets; } # ② 最长前缀且禁用正则,次高
location ~* \.(js|css|png)$ { expires 1y; } # ③ 不区分大小写正则,按文件后缀
location /api/ { proxy_pass http://api-svc/; } # ④ 普通前缀匹配,较长者胜出
location / { try_files $uri $uri/ /index.html; } # ⑤ 兜底,匹配所有未被上面捕获的请求}
注意:^~ 和 = 一旦匹配成功,Nginx 就停止后续检查;而正则 ~/~* 是按配置文件从上到下扫描,首个匹配即生效。
location 内部不能嵌套 server,但可嵌套 location(慎用)
你可以在某个 location 块里再写 location,称为“嵌套 location”,但仅限于前缀匹配类型(无修饰符或 ^~),且实际中极少需要——多数情况用单层 + 合理优先级就能覆盖。
例如允许嵌套的写法(语义清晰,但非必需):
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
<pre class='brush:php;toolbar:false;'>location /admin/api/ {
proxy_pass http://admin-api/;
}
location /admin/static/ {
alias /opt/app/admin-static/;
}}
⚠️ 注意:alias 在嵌套 location 中要特别小心路径拼接,结尾斜杠必须一致;proxy_pass 若带尾部 /,会截断匹配前缀。
不要遗漏 root / alias / proxy_pass 等关键指令
location 本身只做匹配,真正处理请求靠它内部的指令:
-
root /path;:URI 全路径拼到目录后,如location /img/ { root /data; }→ 请求/img/logo.png对应文件/data/img/logo.png -
alias /path/;:替换掉匹配部分,如location /img/ { alias /srv/images/; }→ 请求/img/logo.png对应/srv/images/logo.png(注意 alias 结尾必须有/) -
proxy_pass http://upstream;:转发请求,路径拼接规则取决于写法(带不带尾部/) -
try_files $uri $uri/ /index.html;:常用于 SPA 路由 fallback,避免前端路由刷新 404



















