http {
include mime.types;
default_type application/octet-stream;
server {
root /websites;
listen 80;
server_name localhost;
# don't work
try_files /logo.png /logo.jpg /error;
# works
rewrite ^/e /error;
# works
# return 200 "$request_uri Handled by server block";
location / {
default_type text/plain;
return 200 "Root prefix matched";
}
location /error {
default_type text/plain;
return 404 "Logo not found";
}
}
我想知道这个评估的原因是什么,我在文档和论坛上都找不到任何可靠的解释。
顺便说一下,我曾尝试过以下场景:
- 删除 location / {} 块后,它按预期工作。我知道当向服务器发出请求时,它首先按服务器块进行评估,然后按匹配的位置块进行评估。但似乎
try_files
指令被忽略了(为什么?!!)。如果我没记错的话,try_files
指令的最后一个参数会重写 URI,因此它应该表现得像重写指令。重写和返回指令都按预期工作,无论是否存在位置块匹配,它们每次都会进行评估。
我进行了大量研究,想找到可靠的信息来解释这种情况,但没找到。所以我在这里向了解 Nginx 内部原理的人寻求答案或来源。
答案1
看nginx 如何处理请求。但我将补充一些专门针对您的问题的警告,这些警告很容易观察到,但可能没有很好的记录。
你提到rewrite
和return
指令,但这些属于ngx_http_rewrite_module
它们有自己的评估规则,并且行为与核心指令不同。您说得对,rewrite
上下文return
中的块server
可以在location
选择块之前执行。
正如您所观察到的(除了ngx_http_rewrite_module
),server
上下文的作用类似于默认的location
,也就是说,如果没有其他location
块与请求匹配。显式块的存在location / { ... }
将始终优先。