Python

Как отключить оповещение по email «Invalid HTTP_HOST header» в Django

Spread the love

Вы когда-нибудь получали эти раздражающие электронные письма об ошибке Invalid HTTP_HOST header?

Invalid HTTP_HOST header: '104.131.142.135'. You may need to add u'104.131.142.135' to ALLOWED_HOSTS.

Request repr():
<WSGIRequest
path:/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{},
META:{'HTTP_CONNECTION': 'close',
'HTTP_HOST': '104.131.142.135',
...

Причина, по которой вы их получаете, заключается в том, что кто-то пытается получить доступ к вашему сайту через хост, не указанный в настройке ALLOWED_HOSTS. В моем случае, для этого блога, у меня есть только это:

ALLOWED_HOSTS = ['.webdevblog.ru']

Поэтому, если кто-то заходит на мой сайт, используя хост, который не заканчивается на webdevblog.ru, он выдаст ошибку Bad Request (400). Так как мой логгер настроен для отправки мне всех сообщений об ошибках по электронной почте, я получаю все эти сообщения.

Простой тест — просто зайти на сайт, используя его IP-адрес. Для этого нужно установить соответствие между IP-адресом сервера и тестовым именем, (это можно сделать добавив запись в /etc/hosts), а затем перейдя к этому хосту в веб-браузере. Запись может выглядеть так:

# /etc/hosts
1.2.3.4    www.example.com

Теперь, если вы посетите www.example.com и он попадет на ваш сайт, Django выдаст 400, и вы получите уведомление по электронной почте.

Хорошей новостью является то, что вы можете легко отключить эти оповещения в настройках Django:

...    
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'default',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler',
        }
    },
    'loggers': {
        'django.security.DisallowedHost': {
            'handlers': ['null'],
            'propagate': False,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        '': {
            'handlers': ['console', ],
            'level': 'INFO',
        }
    }
...

Здесь мы добавили нулевой обработчик и установили django.security.DisallowedHost для использования этого нулевого обработчика, и теперь такие ошибки будут игнорироваться.

Так же можно избавиться от этой проблемы в настройках ngnix:

location / {
 ...
  if ( $host !~* ^(yourdomain.com|www.yourdomain.com)$ ) {
     return 444;
  }
....
}
Была ли вам полезна эта статья?
[1 / 1]

Spread the love
Editorial Team

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

11 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

11 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago