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

nginx отвечает на неизвестные имена хостов?

У меня есть два домена, которые указывают на один и тот же сервер, один мы назовем 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;
    # ...
}