Лучший способ предотвратить сервер по умолчанию?

26

У меня есть несколько vhosts, и я хотел бы «отключить» vhost по умолчанию, либо с помощью пустой страницы, страницы с ошибками, либо вообще с использованием наиболее эффективного использования ресурсов Nginx, при этом доступ к другим vhosts возможен только через предварительно определенные домены.

Danh
источник

Ответы:

42

Определите сервер по умолчанию, который возвращает код HTTP 444 :

server {
    listen      80 default_server;
    server_name _;
    return      444;
}

(Возврат кода ошибки 4xx означает, что запросы могут интерпретироваться клиентом как неудачный запрос, скорее пустая страница HTTP 200, но полностью сработало. Поверьте мне .)

Роб Ховард
источник
2
444 - это нестандартный код, специфичный для nginx : «возвращается специальный нестандартный код nginx 444, который закрывает соединение»
bzeaman
2
Это не работает для https. Простое прослушивание 443 default_server также не будет работать, так как ssl-рукопожатие происходит в первую очередь, и nginx выдаст ошибку перед возвратом 444. Одно из решений, которое мне еще предстоит попробовать, но оно должно работать, - это создание самозаверяющего сертификата для сервера https по умолчанию и выборочно перенаправить на http, чтобы избежать ошибок браузера.
Саймон Бенгтссон
Билет nginx, предоставляющий хороший способ отказаться от SSL-соединений, находится здесь . Они также обеспечивают обходной путь , настройку ssl_ciphers aNULL;.
nh2
Обратите внимание на обходной путь я упомянул сломается , не SNI-способных клиентов HTTPS (например Nginx собственного proxy_pass, если не установлен proxy_ssl_server_name on;) от достижения каких - либо других server_names(так , по существу сломать законные server_nameс для порта 443 , что вы действительно хотите , чтобы через). Для получения подробной информации см. Trac.nginx.org/nginx/ticket/195#comment:11 .
nh2
4

Просто определите по умолчанию vhost, который будет указывать на каталог с пустым файлом index.html.

server {
    listen       80 default_server;
    server_name  _ ;
    root /var/www/placeholder ; 
    index index.html;
}

и поместите пустой указатель в / var / www / placeholder

wojciechz
источник
он будет перехватывать каждый запрос, который не попадает ни в одно из ваших доменных имен, и отвечать пустой страницей.
Войцех
Вы не можете просто return '';вместо root...index?
Ориадам
0

почему бы просто не отрицать все

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Джоэл Ма
источник