У меня есть Nginx с несколькими включенными серверными блоками. Каждый сервер отвечает на 1 канонический домен и может пересылать 1 или более на этот канонический URL. У меня есть по крайней мере один сервер (еще не проверил их все), где, если я введу несуществующий домен, указывающий на это поле, Nginx отобразит сайт по своему выбору (всегда тот же сайт, но не тот, который Я после).
Я покопался в конфигурационном файле сайта, на который всегда заходил, но ничего не вижу очевидный который идентифицировал бы его как любой тип сайта по умолчанию, и тем не менее, он всегда появляется, когда я толстым пальцем нажимаю на URL.
Есть мысли о том, что я должен искать, чтобы отследить это?
Причина этого проста. Очень старые или сломанные клиенты не отправляют Host
Поле заголовка HTTP в своих запросах, и если вы используете серверные блоки на основе имени (виртуальные хосты на основе имени в терминах Apache), nginx не может определить, какой из настроенных вами серверов подразумевается клиентом. Та же проблема актуальна для любого другого веб-сервера, который поддерживает эту систему на основе имен. Эта проблема не возникнет, если вы будете использовать систему на основе IP для каждого домена (что также означает, что у вас есть несколько сетевых интерфейсов).
Еще по этой теме? Как nginx обрабатывает запрос
nginx выберет сервер, который будет первым, если нет default
флаг был установлен на любой listen
директива:
server {
server_name server1.com;
}
server {
server_name server2.com;
}
server1.com
будет по умолчанию.
Если вы автоматически включаете символические ссылки из sites-enabled
(конфигурация по умолчанию) файл, который идет первым в каталоге, будет вашим первым сервером.
Хороший вопрос, и вы должны его предотвратить. Нет причин поддерживать этих старых клиентов и абсолютно нет причин поддерживать сломанных клиентов. Проблема легко решается созданием конфигурации сервера по умолчанию для всех серверов. Следующий пример взят из одного из моих проектов и нацелен на текущую версию nginx для разработчиков (1.5.2, но должен работать и со старыми версиями):
# /etc/nginx/sites-enabled/_.conf
# Default server for clients who do not send correct Host header.
# The underline in the file name makes sure that this file comes first in the dir.
server {
server_name _;
listen *:80 default_server deferred;
return 444;
}
Конфигурация обрезана, больше настроек nginx.
Добавить default_server
на ваш listen
директива в server
что вы хотите использовать по умолчанию.