23

I've create a Django (1.7) web application with a Nginx, Gunicorn, Django stack and recently I've started to get a number of errors:

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

After searching around, I've found several response that suggest putting the wildcard as the allowed hosts, i.e.

ALLOWED_HOSTS = ['*']

However I'm still getting this error.

Here is the full error message:

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

Is this something I should be concerned about? Am I missing something here? I thought by putting the wildcard in the allowed hosts, I would eliminate this issue, but that doesn't seem to be the case.

Any help would be much appreciated.

4

3 に答える 3

11

問題: gunicorn(Django App サーバー) が無効なホスト名を取得しています。

サーバー (NginX) に対してリクエストが行われ、HTTP ホスト (またはユーザー エージェント) が空の場合、nginx は HTTP ホストを gunicorn sock に設定します。


解決策nginx.conf: 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;  

    }
}
于 2018-02-23T10:18:57.700 に答える
4

サーバーにリクエストを送信しているクライアントは、次の HTTPHostヘッダーを送信しました。

Host: *.domain.com

これは、HTTP 仕様では無効*であり、ヘッダーでは許可されていません。したがって、Django は HTTP 400 応答で応答し、エラーをログに記録します。

これは、ALLOWED_HOSTS設定に入力した内容とは関係ありません。*は許可されており、Django に任意の (有効な) ホスト名のリクエストを受け入れるように指示します (ただし、 のような無効なホスト名は拒否されます*.domain.com)。

ただし、コメントで他の人が指摘しているように、特定のホストへの接続のみを受け入れるように nginx を構成する必要があります ( server_name)。そのような要求が Django に到達することさえありません。

于 2016-04-17T04:43:15.980 に答える