Django错误(外部IP):无效的HTTP_HOST标头:'* .domain.com'

时间:2015-10-13 08:27:28

标签: django nginx dns wildcard http-host

我创建了一个带有Nginx,Gunicorn,Django堆栈的Dja​​ngo(1.7)Web应用程序,最近我开始遇到一些错误:

  

[Django]错误(外部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)}>

这是我应该关注的吗?我在这里错过了什么吗?我想通过将通配符放在允许的主机中,我会消除这个问题,但似乎并非如此。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

ISSUE gunicorn(您的Django App服务器)获取的主机名无效。

  

向服务器(NginX)和HTTP主机(或。)发出请求时   用户代理)为空,nginx将HTTP主机设置为gunicorn sock。

解决方案:在您的nginx conf(nginx.confsites-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;  

    }
}

答案 1 :(得分:3)

向您的服务器发出请求的客户端已发送以下HTTP Host标头:

Host: *.domain.com

根据HTTP规范,这是无效的 - 标头中不允许* - 因此Django会响应HTTP 400响应并记录错误。

这与您在ALLOWED_HOSTS设置中放置的内容无关,其中允许*并告诉Django接受任何(有效)主机名的请求(它仍将拒绝无效的主机名,如{{ 1}})。

正如其他人在评论中指出的那样,你应该真正配置nginx只接受特定主机(*.domain.com)的连接,这样这些请求甚至不会到达Django。

答案 2 :(得分:-1)

与其在settings.py中关注, ALLOWED_HOSTS = ['*'] (在生产中不是很好的做法)

关注此事- 要响应“ example.com”和任何子域,请以点开头 ALLOWED_HOSTS = ['.example.com', '203.0.113.5']