2015-10-13 9 views
8

Я создал веб-приложение Django (1.7) со стеком Nginx, Gunicorn, Django, и недавно я начал получать номер ошибок:Django ERROR (EXTERNAL IP): недопустимый заголовок HTTP_HOST: '* .domain.com'

[Django] ERROR (EXTERNAL IP): Неверный заголовок HTTP_HOST: '* .domain.com'. Предоставленное доменное имя недействительно согласно RFC 1034/1035.

После поиска вокруг, я нашел несколько ответ, что предложить положить подстановочные знаки разрешенных хостов, т.е.

ALLOWED_HOSTS = ['*'] 

Однако я все еще получаю эту ошибку.

Вот полное сообщение об ошибке:

Request repr(): 
<WSGIRequest 
path:/, 
GET:<QueryDict: {}>, 
POST:<QueryDict: {}>, 
COOKIES:{}, 
META:{'HTTP_ACCEPT_ENCODING': 'none', 
'HTTP_CONNECTION': 'close', 
'HTTP_HOST': '*.domain.com', 
'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2)', 
'HTTP_X_FORWARDED_FOR': '11.111.111.11', 
'HTTP_X_FORWARDED_HOST': 'subdomain.domain.com', 
'HTTP_X_REAL_IP': '11.111.111.11', 
'PATH_INFO': u'/', 
'QUERY_STRING': '', 
'RAW_URI': '/', 
'REMOTE_ADDR': '127.0.0.1', 
'REMOTE_PORT': '51349', 
'REQUEST_METHOD': 'GET', 
'SCRIPT_NAME': u'', 
'SERVER_NAME': '127.0.0.1', 
'SERVER_PORT': '9000', 
'SERVER_PROTOCOL': 'HTTP/1.0', 
'SERVER_SOFTWARE': 'gunicorn/19.1.1', 
'gunicorn.socket': <socket._socketobject object at 0x3877fa0>, 
'wsgi.errors': <gunicorn.http.wsgi.WSGIErrorsWraper object at 0x37e6050>, 
'wsgi.file_wrapper': <class 'gunicorn.http.wsgi.FileWrapper'>, 
'wsgi.input': <gunicorn.http.body.Body object at 0x396cc50>, 
'wsgi.multiprocess': False, 
'wsgi.multithread': False, 
'wsgi.run_once': False, 
'wsgi.url_scheme': 'http', 
'wsgi.version': (1, 0)}> 

Это то, что я должен быть обеспокоен? Я что-то упустил? Я думал, положив шаблон в разрешенных хостах, я бы устранил эту проблему, но это, похоже, не так.

Любая помощь будет высоко оценена.

+0

Я бы не позволили хозяевам символы подстановки, вместо этого использовать список действительно разрешенных хостов, как [www.domain.com, domain.com]. Также настройте Nginx для принятия этих запросов через имя_сервера. – Jingo

+0

@ Jingo благодарит за помощь и быстрый ответ. У меня были домены, добавленные ранее, но столкнулись с этой же ошибкой, поэтому я добавил шаблон в его место. Странный. Я верну его, как вы уже упомянули, и посмотрите, не столкнулись ли я с этими проблемами. – tdsymonds

+0

Теперь я удалил разрешенные хосты и все еще получаю эту ошибку ?! – tdsymonds

ответ

2

Клиент, который делает запрос на сервер послал следующий HTTP Host заголовок:

Host: *.domain.com 

Это является недопустимым в соответствии со спецификацией HTTP - * не допускается в заголовке - значит, Django отвечает ответ HTTP 400 и регистрирует ошибку.

Это не связано с тем, что вы положили в вашем ALLOWED_HOSTS обстановке, где * разрешено и говорит Джанго принимать запросы для любого (действительного) имени хоста (он все равно будет отвергать недопустимые имена хостов, как *.domain.com).

Как было указано в комментариях, вы должны настроить nginx только для приема соединений для определенных хостов (server_name), чтобы такие запросы даже не доходили до Django.

1

ВОПРОС: gunicorn (ваш сервер приложений Django) получает недопустимое имя хоста.

, когда делается запрос на сервер (Nginx) и HTTP хоста (или агента пользователя) пусто, Nginx устанавливает HTTP хоста к gunicorn носка.


Решение: Добавить/обновить директиву в вашем Nginx конф (nginx.conf или sites-enabled/<your-site>.conf) от:

proxy_set_header Host $http_host; 

к (если вы не имеете его установить, просто добавьте ниже),

proxy_set_header Host $host; 

Можно поместить его в location, над proxy_pass директивы:

server { 
    listen 8000; 
    server_name 0.0.0.0; 

    location/{ 
      proxy_set_header Host $host; 
      include proxy_params; 
      proxy_pass http://unix:/<your-path>/yourproject.sock; 

    } 
}