nginx位置匹配多次

时间:2018-12-23 02:55:59

标签: nginx nginx-location nginx-config

我的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 = /块处停止。我尝试将break;包含在location = /块中,但这根本没有改变行为。我知道它与第一个location = /块匹配,因为我在应用服务器上看到的请求是针对/index.html的,该请求大概是由try_file指令重写的(如果我将其更改为{{1 }},我看到它反映在我的应用服务器上。

我已经尝试过像https://nginx.viraptor.info这样的nginx位置测试工具,并且说最终匹配应该只是/foo.html块所描述的“完全匹配”。

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

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

1 个答案:

答案 0 :(得分:1)

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