Как отключить оповещение по 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;
  }
....
}
Была ли вам полезна эта статья?
[0 / 0]

Spread the love