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

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.com после listen в блоке серверов 443 моего основного домена, но это не помогает.

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

Я нашел решение. Как правильно указали @Tero и @Cosmic, у меня всего 443 server блок для основного домена устанавливается по умолчанию 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 ожидает сертификат для любого SSL. server блоков, поэтому вам нужно будет предоставить ему сертификат.

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

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

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