@2mitrij

Nginx, как запретить невалидные поддомены?

С недавнего времени в логах стали появляться записи:

[Django] ERROR (EXTERNAL IP): Invalid HTTP_HOST header: '_tcp.domain.name. The domain name provided is not valid according to RFC 1034/1035

Было решено такие невалидные домены резать на nginx. Гуглением был найден такой regex для валидации: https://stackoverflow.com/a/7933253/13084502

В конфиге nginx прописал:

map $host $host_valid {                                                                                                                                                                       
    "~^(?!.{256})(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+(?:[a-z]{1,63}|xn--[a-z0-9]{1,59})$" 1;                                                                                           
    default 0;                                                                                                                                                                                
}                                                                                                                                                                                             
                                                                                                                                                                                              
server {                                                                                                                                                                                      
    listen 443 ssl;                                                                                                                                                                           
                                                                                                                                                                                              
    server_name ~^(\w+)\.domain.name$;                                                                                                                                    
                                                                                                                                                                                              
    if ($host_valid = 0) {                                                                                                                                                                    
        return 444;                                                                                                                                                                           
    }                                                                                                                                                                                         
                                                                                                                                                                                              
    ...
}


На тестовом сервере работает. Т.к. опыта настройки nginx маловато, то прежде чем пихать на рабочий прошу совета: такое решение правильное, нет никаких подводных камней? Смущает наличие if. Как понял такое не приветствуется у профессионалов. Может есть более простое и изящное решение?
  • Вопрос задан
  • 406 просмотров
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
Резать специально ничего не нужно, достаточно настроить default_server с отлупом, который не будет пропускать запросы для хостов, не перечисленных в настройках.

upd. прочитал ваш комментарий выше - но это ничего не меняет. Добавьте server_name с wildcard`ом, который будет обрабатывать любые ваши поддомены, а остальное будет отбиваться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы