Nginx配置location匹配规则总是不生效怎么办?

♫凌昊 阅读 27

我最近在用 Nginx 部署一个前端项目,想把所有 /api 开头的请求代理到后端服务,但不管怎么改 location 规则都没用,请求还是被当成了静态资源处理。我试过 =、~、^~ 这些前缀,也重启了 Nginx,但就是不走 proxy_pass。

这是我的前端页面里发起的请求代码:

<script>
  fetch('/api/user/profile')
    .then(res => res.json())
    .then(data => console.log(data));
</script>

是不是我的 location 写法有问题?或者匹配顺序搞错了?

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
东方利云
先说最可能的原因:你这个情况大概率是被其他 location 规则先匹配走了。

Nginx 的 location 匹配顺序是这样的:精确匹配 = 最优先,然后是 ^~ 前缀匹配(匹配到就停止匹配),再然后才是正则 ~ 或 ~*,最后才是普通前缀匹配 /。

你试了 =、~、^~ 但还是不行,很可能是你写了类似 location / 这样的规则在前面,把所有请求都当作静态资源处理了。

直接给你能跑的配置:

server {
listen 80;
server_name your-domain.com;

# 静态资源目录
root /var/www/html;
index index.html;

#关键:把 /api 这条规则放在 static 资源规则前面
# ^~ 表示前缀匹配,匹配到就停止搜索
location ^~ /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# 其他请求当作静态资源
location / {
try_files $uri $uri/ /index.html;
}
}


你检查一下是不是把 location /api 放在了 location / 后面。如果是的话,/api 会被 location / 先匹配到,因为 / 也能匹配 /api 开头。

另外提醒一下,修改完配置一定要用 nginx -t 先验证配置有没有语法错误,然后 nginx -s reload 重载配置,别用 restart,那会中断服务的。
点赞
2026-03-19 05:00