nginx 位置匹配多次

nginx location matches multiple times

我的 nginx.conf 看起来像这样

server {
  listen 443 ssl;
  server_name test.com;
  client_max_body_size 100M;

  # test.com/ should be a static page
  location = / {
    root /var/www/
    try_files $uri $uri/ /index.html;
    break;
  }

  # everything else should go to the upstream app server
  location / {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_pass http://127.0.0.1:3000;
  }
}

我的问题是,当我访问 test.com 时,nginx 似乎也在评估 location / 块,因为它正在将请求代理到我的上游服务器,而不是在 location = / 块处停止.我试过在 location = / 块中包含 break; 并且根本没有改变行为。我知道它与第一个 location = / 块匹配,因为我在我的应用程序服务器上看到的请求是针对 /index.html 的,这可能是由 try_file 指令重写的(如果我将其更改为 /foo.html 相反,我看到它反映在我的应用程序服务器上)。

我已经尝试过像 https://nginx.viraptor.info 这样的 nginx 位置测试工具,并且说最终匹配应该只是 location = / 块描述的 "exact match"。

是的,我每次更改配置文件后都会重新启动 nginx。

有人知道为什么会这样吗?任何帮助将不胜感激!

Nginx 处理两个 URI,首先是 /,然后是内部重写的 /index.html。您的配置处理 location / 块中的第二个 URI。

或者,为第二个 URI 添加精确匹配 location,例如:

root /var/www;
location = / { ... }
location = /index.html { }
location / { ... }

或者,您可以安排 try_files 在同一位置处理 URI:

root /var/www;
location = / { 
    try_files /index.html =404;
}
location / { ... }

详情见this document