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。
我的 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。