Назад | Перейти на главную страницу

NGINX перенаправляет все, кроме letsencrypt, на https

У меня простая конфигурация, перенаправляю все, кроме запросов letsencrypt, на https, а затем мои виртуальные хосты только на https ..

В настоящее время все мои запросы перенаправляются на https, а затем на 404 для letsencrypt:

Это мой конфиг ...

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";
    }
}

Ну, не HSTS в моем случае

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

Резюме: поместите 301 редирект внутри / расположение

У вас есть заголовки HSTS, установленные в вашем блоке сервера https. Это означает, что если вы посетите свой сайт с https один раз с вашим браузером, ваш браузер всегда будет подключаться к вашему домену с https после первого посещения.

Это означает, что вы не можете проверить свою конфигурацию в браузере. Вам нужно проверить это с помощью curl или аналогичный инструмент, который не хранит списки HSTS.

Для вашей конфигурации есть небольшая настройка, вы можете использовать простое соответствие префикса location /.well-known/acme-challenge для вашего местоположения LetsEncrypt. nginx будет использовать наиболее точное совпадение из location блоки.

Вы можете создать сниппет для использования в своей конфигурации в /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), так что хорошо известная задача маршрутизируется правильно.