У меня есть два домена, которые указывают на один и тот же сервер, один мы назовем home
и один мы позвоним web
.
Я запускаю nginx на порту 80 для HTTP и 443 для HTTPS. В своих определениях серверов я определил два сервера:
server {
listen 80;
server_name web;
# ...
}
server {
listen 443;
server_name web;
# ...
}
На практике все работает нормально. Однако, когда я пытаюсь получить доступ home
, который указывает на тот же IP-адрес, что и web
, Меня обслуживают web
вместо того, чтобы получить 404 или что-то подобное.
Как настроить nginx на запросы 404, которые не соответствуют имени сервера? Нужно ли мне определять сервер по умолчанию, который просто отскакивает до 404?
Для http:
server {
listen 80 default_server;
server_name _;
return 404;
}
Для https вам действительно нужно указать nginx на ssl cert / key. В соответствии с документация, nginx смотрит только на заголовок Host и не смотрит на SNI TLS при сопоставлении server_name. Это означает, что nginx должен иметь возможность принимать / расшифровывать ssl-соединение, прежде чем он сможет проверить заголовок Host.
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate <path to cert>
ssl_certificate_key <path to key>
return 404;
}
Сертификат / ключ может быть любым сертификатом / ключом, например. самоподписанный.
Если сертификат / ключ не указаны, nginx все равно пытается использовать такой default_server и терпит неудачу, поскольку не может принять ssl-соединение.
Серверный блок Catchall также нуждается в server_name
что вам нужно установить недопустимое значение, например _
. Таким образом, серверный блок не будет соответствовать никакому другому имени хоста и будет использоваться в крайнем случае. Конфигурация будет выглядеть так:
server {
listen 80;
listen 443 ssl;
server_name _;
return 404;
}
Первый сервер {} в вашей конфигурации похож на универсальный, поэтому он и отображается. Добавьте что-то подобное перед сервером listen 80 {}
server {
return 404;
}
server {
listen 80;
server_name web;
# ...
}
server {
listen 443;
server_name web;
# ...
}