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

Nginx: как перенаправить на https, но не на поддомен

Я бы хотел, чтобы Nginx перенаправлял посетителей на HTTPS в моем домене верхнего уровня, но не для определенных поддоменов (потому что я не хочу беспокоиться о добавлении поддоменов в свой сертификат, и это в любом случае не обязательно). Кажется, что происходит то, что Nginx перенаправляет на HTTPS в моем домене верхнего уровня, а также для всех поддоменов, несмотря на то, что я явно помещаю перенаправление только в серверный блок для домена верхнего уровня. Вот как я это делаю:

server {
  server_name example.com;
  listen 80;
  return 301 https://example.com$request_uri;
}

server {
  server_name example.com;
  listen 443 ssl;
  ...
}

server {
  server_name nossl.example.com;
  listen 80;
}

Когда пользователь посещает http://nossl.example.com, они вынуждены использовать SSL (HTTPS) и, как следствие, получают неприятное предупреждение о сертификате. Как я могу этого не делать?

В конфигурации nginx SSL:

Найдите код add_header Strict-Transport-Security:

server {
    listen 443 ssl;
    server_name www.example.com;
    ....
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
}

Пожалуйста, удалите параметр includeSubDomains. Правильный код:

server {
    listen 443 ssl;
    server_name www.example.com;
    ....
    add_header Strict-Transport-Security "max-age=31536000;";
}

Это не применит SSL к поддомену.

Это уродливое решение, которое я придумал. Я добавил еще один серверный блок для https://nossl.example.com что перенаправляет на http://nossl.example.com. Думаю, должно быть более элегантное решение.

server {
  server_name example.com;
  listen 80;
  return 301 https://example.com$request_uri;
}

server {
  server_name example.com;
  listen 443 ssl;
  ...
}

server {
  server_name nossl.example.com;
  listen 80;
}

server {
  server_name nossl.example.com;
  listen 443 ssl;
  return 301 http://nossl.example.com$request_uri;
}