nginx:如何在仍然通过 http 提供一个目录的同时重定向到 https?

nginx: how to redirect to https while still serving one directory via http?

我想阻止人们通过 http 使用我的网站并强制他们使用安全连接。我的 https 证书是由 letsencrypt 颁发的(通过 webroot 选项),这意味着它们通过 http 连接,我在其中提供来自 /.well-known/acme-challenge/ 的静态内容。应重定向所有其他请求以使用 https。按照我的相关部分 nginx.conf

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com admin.example.com;
    location /.well-known/acme-challenge {
        root /app;
        access_log on;
        try_files $uri $uri/ =418;
    }

    return 301 https://$server_name$request_uri;
}

此 https 升级工作正常,所有用户都按预期获得 https 连接。问题是,nginx 会升级每个请求,甚至是来自 letsencrypt 的请求,这会导致 letsencrypt 失败——它甚至不会尝试提供文件(文件存在!)。

我如何确保如果请求通过 http 到达 example.com/.well-known/acme-challenge/[HASH] 它将提供文件(如果找到)或 return 418 错误,同时将所有其他请求升级到不以 https 开头的/.well-known/acme-challenge?感谢您的任何建议

return 301 在服务器范围内,这不是您想要的。将 return 放在默认位置:

location / {
    return 301 https://$server_name$request_uri;
}