我有以下 nginx 配置:

server {
    location ~ ^/(\d+)/(\d+)/(\d+)\.png$ {
        alias /mount/cache/c/$1/$2/$3.png;
        try_files $uri @proxy;
        add_header x-source file;
    }

    location @proxy {
        proxy_pass http://127.0.0.1:28000;
        add_header x-source proxy;
    }
}

我想要实现的是尝试从磁盘加载文件,如果找不到,才向上游询问。

我的问题是它try_files似乎不起作用,它总是请求 @proxy(x-source 标头始终是代理)。如果我注释掉try_files它,它会正确地从磁盘加载文件,但代理部分不起作用。

1

  • 1
    您不想使用正则表达式定义 try_files 和 location 中的别名。它定义不明确,而且没有人真正知道它是如何(或应该如何)工作的。但在这个例子中,根本不需要别名。


    – 


最佳答案
2

alias在这个例子中,您根本不需要使用。

server {
    location ~ ^/(\d+)/(\d+)/(\d+)\.png$ {
        root /mount/cache/c;
        try_files $uri @proxy;
        add_header x-source file;
    }
    ...
}

如果需要alias,则不要使用try_files。例如,使用error_page

server {
    location ~ ^/(\d+)/(\d+)/(\d+)\.png$ {
        alias /mount/cache/c/$1/$2/$3.png;
        add_header x-source file;

        error_page 404 = @proxy;
    }
    ...
}

1

  • 非常感谢,我一直不知道原因是什么alias


    – 

该问题源于您的alias指示。

http://example.com/1/2/3.png假设请求一个资源。

alias指令意味着 nginx 将在 处查找文件/mount/cache/c/1/2/3.png/1/2/3/.png。这是因为alias设置了文件所在的基本路径,然后将$uri附加到 获取最终资源。

这应该与以下配置一起工作:

server {
    location ~ ^/(\d+)/(\d+)/(\d+)\.png$ {
        alias /mount/cache/c;
        try_files $uri @proxy;
        add_header x-source file;
    }

    location @proxy {
        proxy_pass http://127.0.0.1:28000;
        add_header x-source proxy;
    }
}

假设您的文件位于/mount/cache/c目录中。

1

  • 但是说“如果在使用正则表达式定义的位置内使用别名,那么该正则表达式应该包含捕获,并且别名应该引用这些捕获”


    –