Рейтинг:0

nginx не учитывает значение server_name

флаг in
сервер {
    ..
    имя_сервера имя_другого_домена.com;
    ..
}

Я сопоставил свое доменное имя с общедоступным IP-адресом моей виртуальной машины через godaddy.

Когда я ввожу доменное имя в браузере, он получает доступ к веб-сайту, размещенному на виртуальной машине (через nginx). Однако я ожидал, что запрос не будет разрешен nginx, потому что для свойства server_name установлено значение some_other_domain_name.com.

Разве nginx не проверяет свойство server_name?

Richard Smith avatar
флаг jp
См. [как Nginx обрабатывает запрос](http://nginx.org/en/docs/http/request_processing.html).
флаг in
Таким образом, имя_сервера используется только при конфликте с комбинацией IP: порт?
флаг us
`имя_сервера` используется всегда. Проблема, вероятно, связана с вашим блоком сервера по умолчанию, как описано ниже.
Рейтинг:1
флаг br

Существует хорошее объяснение того, как nginx выбирает блоки сервера и местоположения для выполнения запроса в Digital Ocean. Понимание Nginx Server и алгоритмов выбора блоков местоположения.

Короче говоря, nginx сначала выбирает наилучшее совпадение на основе Слушать директивы. И чеки имя сервера только если совпадений больше одного. В том случае, если нет имя сервера соответствует, то он выберет По умолчанию блокировать. Блок по умолчанию либо объявляется как default_server в Слушать Директива или первая.

флаг in
Если серверный блок слушает только 443 (например), и это единственный серверный блок, значит ли это, что любые запросы на 80-м порту не будут обслуживаться? Или этот блок будет использоваться по умолчанию и для порта 80?
флаг br
Если серверный блок слушает только порт 443, он не будет соответствовать на первом этапе и никогда не будет рассматриваться как кандидат на обслуживание запроса на порт 80.
флаг in
Но когда соответствующий серверный блок не найден, разве он не использует 1-й серверный блок независимо от того, что слушает 1-й серверный блок?
флаг br
@переменная, нет. Опять же, nginx выбирает блокировку по умолчанию только для тех, которые имеют *лучшее* соответствие директиве listen. Вы ознакомились со статьей?
флаг in
Да, приятель, но мне это в голову не пришло.
Рейтинг:0
флаг us

Вы не поделились своей полной конфигурацией nginx, так что это предположение о том, чего не хватает в конфигурации.

nginx всегда что-то обслуживает для каждого запроса. Если нет сервер блок, который имеет соответствие имя сервера для запроса nginx использует значение по умолчанию сервер блокировать.

По умолчанию сервер блок может быть блоком, где Слушать директива имеет default_server модификатор.

Если такого блока нет, первый сервер блок по умолчанию.

В вашем случае, я думаю, вам нужно настроить блок сервера по умолчанию следующим образом:

сервер {
    слушать 80 default_server;
    вернуть 444; # разрывает соединение. Может быть 404, если вы хотите вернуть HTTP 404, не найденный
}
флаг in
«Если такого блока не существует, по умолчанию используется первый блок сервера». Но если первый блок сервера слушает только 443 (например), значит ли это, что любые запросы на порт 80 не будут обслуживаться?
флаг us
Я не знаю, так как все мои варианты использования требуют прослушивания портов 80 и 443.
флаг br
@variable, есть хорошая статья о DO https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.