nginx try_files 的奇怪行为。我的配置有什么问题?

c33*_*33s 4 nginx reverse-proxy

os: debian stable (squeeze) nginx:squeeze-backports 1.2.1-2~bpo60+1

try_files 对我来说很奇怪。

这按预期工作,如果未找到 $uri,则在本地尝试 -> 使用 @static 位置

try_files  $uri $uri/ @static;
Run Code Online (Sandbox Code Playgroud)

仅在末尾添加 =404 会导致 404。如果我访问位于 $uri 或 @static 的现有文件,它是否仍然有效,并且仅在 @static 位置上找不到任何内容时才提供 404?

try_files  $uri $uri/ @static =404;
Run Code Online (Sandbox Code Playgroud)

将 =404 放在 @static 之前使其再次工作。为什么?如果文件不在 $uri 或 $uri/ 位置,而是在 @static 上,它应该导致 404 因为 =404 是在 @static 之前(根据我的理解)。如果我访问一个位于 $uri 的文件,它会从 nginx 正确提供(不访问 @static 后端或 =404)

try_files  $uri $uri/ =404 @static ;
Run Code Online (Sandbox Code Playgroud)

我很困惑

编辑:我的目标是:测试文件是否在本地,然后检查该文件的所有上游服务器,如果在这些位置找不到,则返回 404

配置:

upstream domain.com_upstream
{
    server yyy.yyy.yyy.yyy:8000 weight=10 max_fails=3 fail_timeout=3s;
    server zzz.zzz.zzz.zzz:8020 weight=10 max_fails=3 fail_timeout=3s;
}

server 
{
    server_name         www.domain.com;

    listen              xxx.xxx.xxx.xxx:80;

    location @static
    {
        proxy_ignore_client_abort off;
        proxy_intercept_errors    on;
        proxy_next_upstream       http_404 error timeout invalid_header;

        proxy_pass                  http://domain.com_upstream;
        proxy_redirect              off;
        proxy_set_header            Host                $host;
        proxy_set_header            X-Real-IP           $remote_addr;
        proxy_set_header            X-Forwarded-For     $proxy_add_x_forwarded_for;
        client_max_body_size        10m;
        client_body_buffer_size     128k;

        proxy_connect_timeout       10;
        proxy_send_timeout          120;
        proxy_read_timeout          120;

        proxy_buffers 8 16k;
        proxy_buffer_size 32k;
    }

    location ~ ^/test 
    { 
        root /var/www/test;
        try_files $uri @static =404; # exchange with upper try_file examples...
    }

    *** snip ***
}
Run Code Online (Sandbox Code Playgroud)

Max*_*nin 7

你误解了try_files参数。来自文档的引用:

如果没有找到任何文件,则会进行到最后一个参数指定的 uri 的内部重定向。

只有最后一个参数是回退 URI(或命名位置或代码),所有其他参数都是要测试的文件。IE

try_files /file1 /file2 /file3 ... @fallback;
Run Code Online (Sandbox Code Playgroud)

将检查文档根目录下的文件(/file1、/file2、/file3 等),如果没有找到,nginx 将进行内部重定向到 @fallback。

try_files ... @static =404;实际上没有意义,因为它将测试@static在文档根目录下命名的文件,而且很可能它不是您想要的。将try_files ... =404 @static;没有任何意义,也因为它会测试一个名为文件=404

有关文档,请参见此处:http : //nginx.org/r/try_files