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

时间:2017-03-19 11:00:37

标签: http nginx https lets-encrypt nginx-location

我想阻止人们通过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]它将在发现时提供文件或返回418错误,同时将所有其他请求升级到不以/.well-known/acme-challenge开头的https?感谢您的任何建议

1 个答案:

答案 0 :(得分:2)

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

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