nginx: порядок разрешения «имя_сервера»?

8

У меня есть несколько «серверных» блоков в моем nginx.conf. Документация кажется неправильной относительно порядка, в котором происходит сопоставление имени сервера.

Мой конф выглядит примерно так:

server {
  listen 80
  server_name domain.com *.domain.com

  # do stuff
}

server {
  listen 80
  server_name sub.domain.com *.sub.domain.com

  # do something else
}

Я пытаюсь выяснить, почему запросы с host = www.sub.domain.com направляются в правильное место (второй сервер), когда в документации указано, что он должен идти на первый сервер.

Документация Nginx указывает, что серверные блоки проверяются на «совпадение» на совпадения, что означает, что любой запрос с хостом * .sub.domain.com должен быть перехвачен первым сервером, а не вторым сервером. ( http://wiki.nginx.org/HttpCoreModule#server_name )

Кроме того, подстановочный знак * соответствует любому количеству частей субдомена, поэтому * .domain.com соответствует www.sub.domain.com. ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

Если эта документация неверна, каков фактический порядок сопоставления?

user41356
источник

Ответы:

18

Из документации nginx ( http://nginx.org/en/docs/http/server_names.html ):

При поиске виртуального сервера по имени, если имя совпадает более чем с одним из указанных вариантов, например совпадения как с подстановочным знаком, так и с регулярным выражением, будет выбран первый соответствующий вариант в следующем порядке приоритета:

  1. точное имя
  2. самое длинное подстановочное имя, начинающееся со звездочки, например «* .example.org»
  3. самое длинное подстановочное имя, заканчивающееся звездочкой, например «mail. *»
  4. первое совпадение регулярного выражения (в порядке появления в файле конфигурации)
Джастин Л. Фрэнкс
источник
2

В документации сказано:

Сравнивает заголовок Host входящего HTTP-запроса с блоками сервера {...} в файлах конфигурации Nginx и выбирает первый, который соответствует.

Кажется, что происходит то, что он выбирает наилучшее совпадение из всех serverблоков, таким образом www.sub.domain.com, сопоставляя второй конфиг. У меня нет документации, подтверждающей это, поэтому вы можете запустить несколько тестов, чтобы подтвердить такое поведение. Существует также этот документ, говорящий о разрешении имен.

CoreDump
источник