nginx Django Error(外部IP):HTTP_HOST标头无效:*.domain.com

mdfafbf1  于 2023-08-03  发布在  Nginx
关注(0)|答案(4)|浏览(114)

我用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)}>


这是我该担心的事吗我错过了什么吗?我以为通过在允许的主机中添加通配符,可以消除这个问题,但情况似乎并非如此。
如果你能帮忙的话,我将不胜感激。

smtd7mpg

smtd7mpg1#

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

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

解决方案:在nginx conf中添加/更新指令(nginx.confsites-enabled/<your-site>.conf),来自:

proxy_set_header Host $http_host;

字符串
到(如果您没有设置,只需添加以下内容),

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;  

    }
}

hs1rzwqc

hs1rzwqc2#

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

Host: *.domain.com

字符串
根据HTTP规范,这是无效的-*不允许在头部中-因此Django使用HTTP 400响应进行响应并记录错误。
这与你在ALLOWED_HOSTS设置中的设置无关,其中*是允许的,并告诉Django接受任何(有效)主机名的请求(它仍然会拒绝无效的主机名,如*.domain.com)。
然而,正如其他人在评论中指出的那样,你真的应该配置nginx只接受特定主机(server_name)的连接,这样的请求甚至不会到达Django。

wwtsj6pe

wwtsj6pe3#

导致这个错误的问题是我给了一个非标准域名。(根据RFC 1034/1035)。我的域名中有一个下划线(比如“example_domain.com”)。
我删除了_,它工作了!

9jyewag0

9jyewag04#

而不是在settings.py中有以下内容,ALLOWED_HOSTS = ['*'](在生产中不是一个好的做法)

**按照此操作-**要响应“example.com”和任何子域,请以点ALLOWED_HOSTS = ['.example.com', '203.0.113.5']开始域

相关问题