Вопрос: 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?


5
2017-12-04 07:00


Источник




Ответы:


Блок сервера Catchall также нуждается в server_name что вам нужно установить недопустимое значение, например _, Таким образом, серверный блок не будет соответствовать другому имени хоста и будет использоваться в качестве последнего средства. Конфигурация будет выглядеть так:

server {
    listen 80;
    listen 443 ssl;

    server_name _;

    return 404;
}

5
2017-12-09 11:30



К сожалению, во встроенной системе, которую я использую, это не работает, и у меня нет способа получить журналы. Выполнить, но не можете проверить, что это работает. - Naftuli Kay


Для http:

server {
    listen 80 default_server;
    server_name _;
    return 404;
}

Для https вам действительно нужно указать nginx в ssl cert / key. В соответствии с документация, nginx смотрит только на заголовок «Host» и не смотрит на SNSI SNS при сопоставлении имени_сервера. Это означает, что nginx должен иметь возможность принимать / расшифровывать ssl-соединение, прежде чем он сможет проверить заголовок Host.

server {
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>
    ssl_certificate_key <path to key>
    return 404;
}

Сертификат / ключ может быть любым сертификатом / ключом, например. самозаверяющими.

Если cert / key не указан, nginx по-прежнему пытается использовать такой default_server и терпит неудачу, поскольку не может принять ssl-соединение.


3
2018-03-30 20:43





Первый сервер {} в вашем конфиге подобен catch-all, поэтому он отображается. Добавьте что-то подобное перед сервером listen 80 {}

server {
    return 404;
}

server {
    listen 80;
    server_name web;
    # ...
}

server {
    listen 443;
    server_name web;
    # ...
}

2
2017-12-04 07:04



Отлично, но похоже, что HTTPS-запросы по-прежнему отправляются в неправильное место. У меня есть SNI, скомпилированный в nginx, есть ли способ сделать то же самое для непревзойденных запросов HTTPS? - Naftuli Kay
добавьте еще один для прослушивания 443, затем - Mike
Если я добавлю server { listen 443 default_server; return 404; }, мои другие виртуальные хосты SSL нарушены. - Naftuli Kay
См. Мой ответ - нужно указать cert / key, потому что nginx рассматривает заголовок Host (а не SNI) для соответствия сервера. Если cert / key не указан, nginx по-прежнему пытается использовать такой default_server и терпит неудачу, поскольку не может принять ssl-соединение. - AndreyT