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,因此它应该表现得像rewrite
指令一样。rewrite
和return
指令都按预期工作,无论是否有位置块匹配,它们每次都会进行评估。
我进行了大量研究,想找到可靠的信息来解释这种情况,但没找到。所以我在这里向了解 Nginx 内部原理的人寻求答案或来源。