
У меня есть сервер 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
after 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, поэтому вам нужно будет предоставить ему сертификат.