Nginx не прослушивает HTTPS-запросы для поддоменов

Nginx не прослушивает HTTPS-запросы для поддоменов

У меня есть сервер Nginx, на котором размещены как основной домен foo.com, так и поддомен bar.foo.comдля веб-сайта. У меня есть только сертификат для основного домена, поэтому мне нужны только HTTP-запросы для поддомена. Я настроил оба блока сервера, и все запросы работают хорошо: http://foo.comбудут перенаправлены на https://foo.com, и http://bar.foo.comпросто останутся на HTTP.

Однако при попытке подключения возникает проблема https://bar.foo.com. Хотя я и не настроил блок сервера поддоменов для прослушивания запросов 443 или SSL, запрос все равно обрабатывается, и после получения предупреждения от браузера о том, что сертификат имеет другое имя хоста, чем запрашиваемое мной, страница, которую я получаю, оказывается страницей с основного домена foo.com.

Итак, судя по всему, serverблок, который должен был прослушивать только HTTPS-запросы моего основного домена, каким-то образом прослушивает также HTTPS-запросы поддомена. Я не хочу, чтобы это произошло.

Вот моя конфигурация для основного домена:

server {
  listen       80;
  server_name  foo.com www.foo.com;

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

server {
  listen       443 ssl;
  server_name  foo.com www.foo.com;

  ssl                  on;
  ssl_certificate      /etc/nginx/cert/foo.com.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.com.key;
  ...

  location / {
    root   /var/www/foo.com/public_html;
    index  index.html index.htm;
  }
}

Вот моя конфигурация для поддомена:

server {
  listen       80;
  server_name  bar.foo.com www.bar.foo.com;

  location / {
    root   /var/www/bar.foo.com/public_html;
    index  index.html index.htm;
  }
}

А вот фрагмент файла конфигурации Nginx:

server {
  listen       80 default_server;
  listen       [::]:80 default_server;
  server_name  _;
  root         /usr/share/nginx/html;

  location / {
}

Я пробовал удалить foo.comafter listenв блоке сервера 443 моего основного домена, но это не помогло.

Я бы хотел, чтобы Nginx либо не слушал такие запросы, https://bar.foo.comлибо просто возвращал 404 или 444.

решение1

Поскольку для порта 443 настроен только один serverблок, это виртуальный сервер по умолчанию, используемый nginx для обслуживания всех запросов к порту 443.

Чтобы добавить сервер по умолчанию для порта 443 (TLS), вы можете добавить следующий виртуальный хост:

server {
    listen 443 default_server;
    server_name _;
    return 444;
}

решение2

Я нашел решение. Как правильно указали @Tero и @Cosmic, мой единственный serverблок 443 для основного домена устанавливается как serverблок по умолчанию для всех запросов 443.

Я закомментировал serverблок в файле конфигурации Nginx /etc/nginx/nginx.confи добавил следующие два serverблока:

server {
  listen      80 default_server;
  server_name  _;
  return 444;
}

server {
  listen       443 ssl default_server;
  server_name  _;
  ssl_certificate      /etc/nginx/cert/foo.bar.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.bar.key;
  return 444;
}

Первый параметр будет установлен на serverблокировку по умолчанию для любых HTTP-запросов, отбрасывая все несоответствующие запросы, а второй параметр аналогичным образом будет отбрасывать все несоответствующие запросы 443 или HTTPS.

Решение, предоставленное @Tero, не сработает, поскольку Nginx ожидает сертификат для любых serverблоков SSL, поэтому вам нужно будет предоставить ему сертификат.

Связанный контент