我的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。
任何人都知道为什么会这样吗?任何帮助将不胜感激!
答案 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。