В моем 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):
При поиске виртуального сервера по имени, если имя соответствует более чем одному из указанных вариантов, например совпадают имя подстановочного знака и регулярное выражение, будет выбран первый подходящий вариант в следующем порядке приоритета:
В документации говорится:
Сравнивает заголовок Host входящего HTTP-запроса с блоками server {...} в файлах конфигурации Nginx и выбирает первый из них.
Кажется, что происходит то, что он выбирает лучший матч из всех server
блоки, так что www.sub.domain.com
, соответствующий второму конфигу. У меня нет документации, подтверждающей это, поэтому вы можете запустить несколько тестов, чтобы подтвердить это поведение. А также есть этот документ говорю о разрешении имен.