如何使用 nginx 将所有 http 请求转发到 https 而不破坏 letsencrypt

如何使用 nginx 将所有 http 请求转发到 https 而不破坏 letsencrypt

我使用 Nginx 作为 Rstudio 服务器和 Shiny 服务器的反向代理,以保护与这些服务的连接。我使用 Letencrypt 获取免费签名证书。

我有这个 letsencrypt 条目来验证我的身份。

server { 
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;

  root /usr/share/nginx/html;
  index index.html index.htm;

  # Make site accessible from http://localhost/
  server_name mydomain.com;

  location ~ /.well-known {

    allow all;
  }
}

我还有另一个server监听 443 和proxy_redirect我的服务器。那里一切都正常。我想要做的是

server {
listen 80;
return 301 https://$host$request_uri;
}

但我认为这会破坏 letsencrypt,那么如何在不破坏 letsencrypt 验证的情况下实现上述操作?

答案1

我的工作配置是:

server {
         listen 80;
         listen [::]:80;
         server_name example.com www.example.com;

         root /srv/www/empty;

         include includes/letsencrypt;

         location / {
                 return 301 https://www.example.com$request_uri;
         }
}

Ansible在哪里/etc/nginx/includes/letsencrypt管理并包含:

location /.well-known/acme-challenge/ {
         try_files $uri =404;
}

并且/srv/www/empty是一个空目录,只有在使用 Let's Encrypt 发出挑战(使用--webroot)时才包含文件。

然后使用以下命令运行 Let's Encrypt:

letsencrypt certonly --webroot -w /srv/www/empty -d example.com -d www.example.com

相关内容