2015-10-13 6 views
8

Ich habe eine Django (1.7) Webanwendung mit einem Nginx, Gunicorn, Django Stack erstellt und vor kurzem habe ich angefangen eine Nummer zu bekommen der Fehler:Django FEHLER (EXTERNAL IP): Ungültiger HTTP_HOST Header: '* .domain.com'

[Django] FEHLER (EXTERNAL IP): Ungültige HTTP_HOST-Kopfzeile: '* .domain.com'. Der angegebene Domänenname ist nicht gemäß RFC 1034/1035 gültig.

Nach der Suche um, habe ich mehrere Antwort gefunden, die den Platzhalter als die erlaubten Hosts vorschlagen setzen, das heißt

ALLOWED_HOSTS = ['*'] 

jedoch noch diesen Fehler Ich erhalte. Hier

ist die vollständige Fehlermeldung:

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)}> 

Ist das etwas, was ich sollte besorgt sein? Fehle ich hier etwas? Ich dachte, indem ich den Platzhalter in die erlaubten Hosts setzte, würde ich dieses Problem beseitigen, aber das scheint nicht der Fall zu sein.

Jede Hilfe würde sehr geschätzt werden.

+0

Ich würde nicht erlaubt Gastgeber Platzhalter verwenden, anstatt eine Liste der wirklich erlaubt Hosts wie [www.domain.com, domain.com]. Konfigurieren Sie auch Ihr Nginx, um diese Anfragen über server_name zu akzeptieren. – Jingo

+0

@Jingo danke für Ihre Hilfe und schnelle Antwort. Ich hatte die Domains zuvor hinzugefügt, habe aber den gleichen Fehler festgestellt, weshalb ich den Platzhalter an seiner Stelle hinzugefügt habe. Seltsam. Ich werde es zurückstellen, wie Sie erwähnt haben, und sehen, ob ich diese Probleme immer noch erhalte. – tdsymonds

+0

Ich habe jetzt die Platzhalter erlaubt Hosts entfernt und immer noch diesen Fehler erhalten ?! – tdsymonds

Antwort

2

Der Client, der eine Anfrage an den Server macht hat folgende HTTP Host Header gesendet:

Host: *.domain.com 

Dies ist ungültig gemäß der HTTP-Spezifikation - * ist nicht im Header erlaubt - daher Django antwortet mit eine HTTP 400-Antwort und protokolliert den Fehler.

Dies ist nicht im Zusammenhang zu dem, was Sie in Ihrem ALLOWED_HOSTS Einstellung setzen, wo * erlaubt ist, und sagt Django Anfragen für jede (gültig) Hostnamen zu akzeptieren (es wird immer noch ablehnen ungültige Host-Namen wie *.domain.com).

Wie andere in den Kommentaren jedoch darauf hingewiesen haben, sollten Sie nginx nur so konfigurieren, dass nur Verbindungen für bestimmte Hosts akzeptiert werden (server_name), damit solche Anfragen nicht einmal Django erreichen.

1

AUSGABE: gunicorn (Ihr Django App-Server) erhält einen ungültigen Hostnamen.

wenn eine Anfrage an den Server (NGINX) und die HTTP-Host (oder User Agent) hergestellt ist, ist leer, nginx stellt die HTTP-Host an die gunicorn Socke.


Lösung: Hinzufügen/Aktualisieren einer Richtlinie in Ihrem nginx conf (nginx.conf oder sites-enabled/<your-site>.conf) aus:

proxy_set_header Host $http_host; 

zu (wenn Sie es nicht haben, nur hinzufügen folgende),

proxy_set_header Host $host; 

Kann es im Inneren des location setzen, über der proxy_pass Richtlinie:

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; 

    } 
}