Nginx try_files 在服务器块内不起作用

Nginx try_files 在服务器块内不起作用
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 如何处理请求。但我将补充一些专门针对您的问题的警告,这些警告很容易观察到,但可能没有很好的记录。

你提到rewritereturn指令,但这些属于ngx_http_rewrite_module它们有自己的评估规则,并且行为与核心指令不同。您说得对,rewrite上下文return中的块server可以在location选择块之前执行。

正如您所观察到的(除了ngx_http_rewrite_module),server上下文的作用类似于默认的location,也就是说,如果没有其他location块与请求匹配。显式块的存在location / { ... }将始终优先。

相关内容