tds*_*nds 12 django dns wildcard nginx http-host
我创建了一个带有Nginx,Gunicorn,Django堆栈的Django(1.7)Web应用程序,最近我开始遇到一些错误:
[Django]错误(外部IP):无效的HTTP_HOST标头:'*.domain.com'.根据RFC 1034/1035,提供的域名无效.
在搜索之后,我发现了一些响应,建议将通配符作为允许的主机,即
ALLOWED_HOSTS = ['*']
Run Code Online (Sandbox Code Playgroud)
但是我仍然遇到这个错误.
这是完整的错误消息:
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)}>
Run Code Online (Sandbox Code Playgroud)
这是我应该关注的吗?我在这里错过了什么吗?我想通过将通配符放在允许的主机中,我会消除这个问题,但似乎并非如此.
任何帮助将非常感激.
ISSUE :( gunicorn您的Django App服务器)获取的主机名无效.
当向服务器(NginX)发出请求并且HTTP主机(或用户代理)为空时,nginx将HTTP主机设置为gunicorn sock.
解决方案:在nginx conf(nginx.conf或sites-enabled/<your-site>.conf)中添加/更新指令:
proxy_set_header Host $http_host;
Run Code Online (Sandbox Code Playgroud)
to(如果你没有设置,只需添加以下内容),
proxy_set_header Host $host;
Run Code Online (Sandbox Code Playgroud)
可以把它放在指令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;
}
}
Run Code Online (Sandbox Code Playgroud)
向服务器发出请求的客户端已发送以下 HTTPHost标头:
Host: *.domain.com
Run Code Online (Sandbox Code Playgroud)
根据 HTTP 规范,这是无效的 -*标头中不允许 - 因此 Django 使用 HTTP 400 响应进行响应并记录错误。
这与您在设置中放置的内容无关ALLOWED_HOSTS,其中*允许并告诉 Django 接受对任何(有效)主机名的请求(它仍然会拒绝无效主机名,例如*.domain.com)。
然而,正如其他人在评论中指出的那样,您实际上应该将 nginx 配置为仅接受特定主机 ( server_name) 的连接,以便此类请求甚至不会到达 Django。
| 归档时间: |
|
| 查看次数: |
10325 次 |
| 最近记录: |