nginx try_files 行为异常。我的配置有什么问题?

nginx try_files 行为异常。我的配置有什么问题?

操作系统:debian 稳定版(squeeze) nginx:squeeze-backports 1.2.1-2~bpo60+1

try_files 对我来说行为很奇怪。

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

try_files  $uri $uri/ @static;

只需在末尾添加 =404 就会导致 404。如果我访问位于 $uri 或 @static 的现有文件,它仍然有效吗?并且只有在 @static 位置未找到任何内容时才会出现 404?

try_files  $uri $uri/ @static =404;

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

try_files  $uri $uri/ =404 @static ;

我很困惑

编辑:我的目标是:测试文件是否在本地,然后检查所有上游服务器中的文件,如果在这些位置找不到该文件,则返回 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 ***
}

答案1

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

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

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

try_files /file1 /file2 /file3 ... @fallback;

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

try_files ... @static =404;实际上没有任何意义,因为它将测试名为 的文件@static,而这很可能不是您想要的。 这try_files ... =404 @static;也没有意义,因为它将测试名为 的文件=404

请参阅此处的文档:http://nginx.org/r/try_files

答案2

为了完整性(来自 kolbyjack @ irc #nginx 的回答):

科尔比杰克:您只能获得一个后备方案。无论 @static 还是 =404 哪个先出现,都会被测试是否存在于文件中。这将失败,然后 nginx 会转到后备方案

c33s:我不确定我是否理解,如果我定义多个 try_file 选项,它们不会从左到右进行测试?

科尔比杰克:没错,但除了最后一个之外,其他所有文件都作为磁盘上的文件进行测试。因此,try_files $uri @static =404; 查找 $document_root$uri,然后查找 $document_root@static,如果两者都不存在,则发出 404。try_files $uri =404 @static 查找 $document_root$uri,然后查找 $document_root=404,如果两者都不存在,则内部重定向到 @static

c33s:所以如果@static 不是本地文件系统上的位置,那么它仅作为最后一个选项才有意义?

科尔比杰克:除了最后一个参数之外的所有内容都是正确的,应该是您想要测试其在磁盘上是否存在的东西

c33s:您是否想在 serverfault 上回答以获得声誉?如果不想,我会将您的答案复制到 serverfault 并自己回答我的问题……

科尔比杰克:你去吧,我太忙了

相关内容