我想要做的是有一个服务器块,使得对我的域的请求(没有指定子域)可以成功提供带有 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/foo
,foo
将成功下载 - 但我收到 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;
}
这样我们就避免使用alias
with try_files
。我们只需在 中捕获文件名location
,然后在 中使用捕获的文件名try_files
。