web-dev-qa-db-ja.com

Djangoエラー(外部IP):無効なHTTP_Hostヘッダー: '* .domain.com'

Nginx、Gunicorn、Djangoスタックを使用してDjango(1.7)Webアプリケーションを作成しましたが、最近、いくつかのエラーが発生し始めました。

[Django]エラー(外部IP):無効なHTTP_Hostヘッダー: '*。domain.com'。指定されたドメイン名は、RFC1034/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)}>

これは私が心配すべきことですか?ここで何かが足りませんか?許可されたホストにワイルドカードを挿入することで、この問題を解決できると思いましたが、そうではないようです。

どんな助けでも大歓迎です。

13
tdsymonds

[〜#〜] issue [〜#〜]gunicorn(あなたのDjangoアプリサーバー)は無効なホスト名を取得しています。

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


ソリューション:nginx conf(nginx.confまたはsites-enabled/<your-site>.conf)にディレクティブを追加/更新します。

proxy_set_header Host $http_Host;

to(設定していない場合は、以下を追加してください)、

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;  

    }
}
6
Nabeel Ahmed

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

Host: *.domain.com

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

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

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

4
solarissmoke