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

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

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

Мой 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)

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

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

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

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

В документации говорится:

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

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