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

В чем разница между server_name _ и server_name «» в Nginx?

Я хочу установить серверный блок по умолчанию для обработки любых имен хостов, не совпадающих с моими точными 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/