Я хочу установить серверный блок по умолчанию для обработки любых имен хостов, не совпадающих с моими точными server_name
ценности. Но я не уверен, какой из них использовать.
server {
listen 80 default_server;
server_name ""; # this is by default if no server_name specified
return 444;
}
или
server {
listen 80 default_server;
server_name _;
return 444;
}
Я тестировал, и, похоже, они ведут себя одинаково. Есть ли между ними разница?
Краткий ответ: Да, есть разница между server_name "";
и server_name _;
Длинный ответ: server_name "";
определяет соответствие запросу без host
заголовок начиная с 0.8.48 и поддерживается с 0.7.12.
https://nginx.org/en/docs/http/request_processing.html
Если запросы без поля заголовка «Host» не должны быть разрешены, можно определить сервер, который просто отбрасывает запросы:
server { listen 80; server_name ""; return 444; }
Здесь в качестве имени сервера устанавливается пустая строка, которая будет соответствовать запросам без поля заголовка «Host», и возвращается специальный нестандартный код nginx 444, который закрывает соединение.
С другой стороны, server_name _;
определяет недопустимые имена серверов, которые никогда не пересекаются с каким-либо настоящим именем. Это просто несовпадение. Таким образом, в случае отсутствия совпадений nginx выберет первый блок server {} и использует его.
В заключение вы можете использовать server_name _;
для общего серверного блока, но не server_name "";
.
Ссылка - https://stackoverflow.com/questions/9454764/nginx-server-name-wildcard-or-catch-all https://blog.gahooa.com/2013/08/21/nginx-how-to-specify-a-default-server/