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

tds*_*nds 12 django dns wildcard nginx http-host

我创建了一个带有Nginx,Gunicorn,Django堆栈的Dja​​ngo(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)

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

任何帮助将非常感激.

Nab*_*med 6

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

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


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

  • 在我的文件中添加这个 proxy_set_header 后,现在我在加载主页时收到“400 个错误请求”, (2认同)
  • `400` 是否与 NGINX 中没有 `proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;` 以及 Django 设置中没有 `SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')` 有关? (2认同)

sol*_*oke 4

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

Host: *.domain.com
Run Code Online (Sandbox Code Playgroud)

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

这与您在设置中放置的内容无关ALLOWED_HOSTS,其中*允许并告诉 Django 接受对任何(有效)主机名的请求(它仍然会拒绝无效主机名,例如*.domain.com)。

然而,正如其他人在评论中指出的那样,您实际上应该将 nginx 配置为仅接受特定主机 ( server_name) 的连接,以便此类请求甚至不会到达 Django。