NGINX 将除了 letsencrypt 之外的所有内容重定向到 https

NGINX 将除了 letsencrypt 之外的所有内容重定向到 https

我有一个简单的配置,将除了 letsencrypt 请求之外的所有内容重定向到 https,然后让我的虚拟主机仅有的在 https 上。

目前,我的所有请求都重定向到 https,然后 letsencrypt 出现 404:

这是我的配置...

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name _;
        location ^~ /.well-known/acme-challenge/ {
            allow all;
            default_type text/plain;
            return 200 "$1.abcd-efgh";
        }

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

server {
    listen 443 ssl;
    server_name plex.my_domain.com;

    ssl_session_timeout 30m;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_certificate      /root/.acme.sh/plex.my_domain.com/fullchain.cer;
    ssl_certificate_key  /root/.acme.sh/plex.my_domain.com/plex.my_domain.com.key;
    ssl_session_cache shared:SSL:10m;


    add_header X-Xss-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Strict-Transport-Security "max-age=2592000; includeSubdomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    proxy_hide_header X-Powered-By;
    add_header 'Referrer-Policy' 'no-referrer';
    add_header Content-Security-Policy "frame-ancestors my_domain.com plex.my_domain.com;";


    location / {
        proxy_pass http://127.0.0.1:32400;

        proxy_set_header Range $http_range;
        proxy_set_header If-Range $http_if_range;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        #Next three lines allow websockets
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

答案1

您在 https 服务器块中设置了 HSTS 标头。这意味着如果您https使用浏览器访问您的网站一次,您的浏览器在第一次访问后将始终使用 https 连接到您的域。

这意味着您无法使用浏览器测试您的配置。您需要使用curl不存储 HSTS 列表的类似工具进行测试。

您的配置有一个小调整,您可以location /.well-known/acme-challenge对 LetsEncrypt 位置使用简单的前缀匹配。nginx 将使用块中最具体的匹配location

答案2

嗯,对我来说不是 HSTS

server {
    # ...
    location /.well-known/acme-challenge/ {
        # put your configuration here, if needed
    }
    location / {
        return 301 https://$server_name$request_uri;
    }
}

摘要:将 301 重定向放在/位置内

答案3

您可以创建一个代码片段以在您的配置中使用/etc/nginx/snippets.d/letsencrypt

location ~ /\.well-known/acme-challenge/ {
  allow all;
  default_type "text/plain";
  root /usr/share/nginx/html;
  try_files $uri =404;
  break;
} 

然后将其包含在您的位置中:

server {
  listen 80;
  server_name *.yourdomain.org yourdomain.org;
  location / {
    return 301 https://$host$request_uri;
  }
}

server {
  listen 443 ssl;
  server_name *.yourdomain.org yourdomain.org;
  include snippets.d/letsencrypt;
  ssl_certificate     /etc/letsencrypt/live/yourdomain.org/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/yourdomain.org/privkey.pem;
  location / {
      # your config for the domain goes here
  }
}
  1. 确保 301 重定向位于location块内(否则每次都会被调用)。

  2. 确保重定向指向整个域而不是另一个域的子目录(如https://yourdomain.org/subdir$request_uri),以便正确路由众所周知的挑战。

相关内容