У меня есть сервер 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;
}