我用Nginx、Gunicorn、Django堆栈创建了一个Django(1.7)Web应用程序,最近我开始得到一些错误:
[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)}>
型
这是我该担心的事吗我错过了什么吗?我以为通过在允许的主机中添加通配符,可以消除这个问题,但情况似乎并非如此。
如果你能帮忙的话,我将不胜感激。
4条答案
按热度按时间smtd7mpg1#
问题:
gunicorn
(您的Django App服务器)获取的主机名无效。当向服务器(NginX)发出请求并且HTTP主机(或用户代理)为空时,nginx将HTTP主机设置为gunicorn sock。
解决方案:在nginx conf中添加/更新指令(
nginx.conf
或sites-enabled/<your-site>.conf
),来自:字符串
到(如果您没有设置,只需添加以下内容),
型
可以将它放在
location
中,在proxy_pass
指令之上:型
hs1rzwqc2#
向您的服务器发出请求的客户端已发送以下HTTP
Host
标头:字符串
根据HTTP规范,这是无效的-
*
不允许在头部中-因此Django使用HTTP 400响应进行响应并记录错误。这与你在
ALLOWED_HOSTS
设置中的设置无关,其中*
是允许的,并告诉Django接受任何(有效)主机名的请求(它仍然会拒绝无效的主机名,如*.domain.com
)。然而,正如其他人在评论中指出的那样,你真的应该配置nginx只接受特定主机(
server_name
)的连接,这样的请求甚至不会到达Django。wwtsj6pe3#
导致这个错误的问题是我给了一个非标准域名。(根据RFC 1034/1035)。我的域名中有一个下划线(比如“example_domain.com”)。
我删除了_,它工作了!
9jyewag04#
而不是在settings.py中有以下内容,
ALLOWED_HOSTS = ['*']
(在生产中不是一个好的做法)**按照此操作-**要响应“example.com”和任何子域,请以点
ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
开始域