Найкращий спосіб запобігти серверу за замовчуванням?


26

У мене є декілька vhosts, і я хотів би "вимкнути" vhost за замовчуванням, будь-якою, порожньою сторінкою, сторінкою помилок або взагалі будь-яким найефективнішим використанням ресурсів Nginx, при цьому дозволяючи доступ лише іншим vhosts через заздалегідь визначені домени.

Відповіді:


42

Визначте сервер default_server, який повертає код HTTP 444 :

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

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


2
444 - це нестандартний специфічний код nginx : "повертається спеціальний нестандартний код 444 nginx, який закриває з'єднання"
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?
oriadam

0

чому б просто не заперечувати всіх

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.