nginx:成功的 try_files 是否不会在不涉及其他位置块的情况下完成请求?

nginx:成功的 try_files 是否不会在不涉及其他位置块的情况下完成请求?

我想要做的是有一个服务器块,使得对我的域的请求(没有指定子域)可以成功提供带有 uri 前缀的任何现有文件/.well-known/acme-challenge/,但对于其他任何文件都会给出 404。

    server {
    listen       443 ssl;
    listen       80;
    server_name  example.com;
    # Satisfy acme verification for both ports 443 and 80
    location /.well-known/acme-challenge/ {
        alias /usr/share/nginx/acme-challenges/;
        try_files $uri =404;
        return 200;
    }
    location / {
        return 404;
    }
}

我发现,如果文件/usr/share/nginx/acme-challenges/foo存在且 nginx 进程可读取,则对于请求http://example.com/.well-known/acme-challenge/foofoo将成功下载 - 但我收到 404 状态代码和默认的 nginx 错误页面。最初,我没有在return 200;后面添加行,try_files因为我认为如果try_files成功,则不会涉及其他位置块。我尝试添加它以“确保”其他位置块不会执行,但这没有帮助。

我确信其他位置块导致了 404,因为如果我将其内容更改为,return 200;那么我将成功下载并且没有正文(无论显示什么,例如,当我在地址栏中输入请求时,谷歌主页仍然在原处)。

我完全搞不懂。文档指出,当选择 fallback uri 时,try_files 会导致内部重定向,但当初始文件成功时则不会!

答案1

我猜测下面的方法可以奏效:

location ~ /.well-known/acme-challenge(/.+)$ {
    root /usr/share/nginx/acme-challenges;
    try_files $1 =404;
}

这样我们就避免使用aliaswith try_files。我们只需在 中捕获文件名location,然后在 中使用捕获的文件名try_files

相关内容