我将django站点从http升级到https后,我不断收到"无效的HTTP_HOST标题"错误邮件

yan*_*gxg 10 python django https http nginx

最近,我将我的一个django站点从http升级到https.然而,在此之后,我Invalid HTTP_HOST header在收到此类电子邮件之前不断收到错误电子邮件.

以下是一些日志消息:

[Django] ERROR(外部IP):无效的HTTP_HOST标头:'123.56.221.107'.您可能需要将"123.56.221.107"添加到ALLOWED_HOSTS.


[Django] ERROR(外部IP):HTTP_HOST标头无效:'www.sgsrec.com'.您可能需要将"www.sgsrec.com"添加到ALLOWED_HOSTS.


[Django]错误(外部IP):HTTP_HOST标头无效:'sgsrec.com'.您可能需要将'sgsrec.com'添加到ALLOWED_HOSTS.

在/ apple-app-site-association上报告无效的HTTP_HOST标题:'sgsrec.com'.您可能需要将'sgsrec.com'添加到ALLOWED_HOSTS.


无效的HTTP_HOST标题:'www.pythonzh.cn'.您可能需要将"www.pythonzh.cn"添加到ALLOWED_HOSTS.

在/无效的HTTP_HOST标题报告:'www.pythonzh.cn'.您可能需要将"www.pythonzh.cn"添加到ALLOWED_HOSTS.

请求方法:GET请求URL:http://www.pythonzh.cn/Django版本:1.10.6


[Django] ERROR(EXTERNAL IP):无效的HTTP_HOST标题:'pythonzh.cn'.您可能需要将'pythonzh.cn'添加到ALLOWED_HOSTS.

奇怪的是,我只更改了我的博客网站www.zmrenwu.comnginx配置,但似乎我所有托管在123.56.221.107上的网站都受到影响.

当然,我正确设置了ALLOWED_HOSTS:

ALLOWED_HOSTS = ['.zmrenwu.com']
ALLOWED_HOSTS = ['.sgsrec.com']
ALLOWED_HOSTS = ['.pythonzh.cn']
Run Code Online (Sandbox Code Playgroud)

我博客网站的Nginx配置www.zmrenwu.com:

server {
    charset utf-8;
    server_name zmrenwu.com www.zmrenwu.com;
    listen 80;
    return 301 https://www.zmrenwu.com$request_uri;
}

server {
    charset utf-8;
    server_name zmrenwu.com;
    listen 443;

    ssl on;
    ssl_certificate /etc/ssl/1_www.zmrenwu.com_bundle.crt;
    ssl_certificate_key /etc/ssl/2_www.zmrenwu.com.key;

    return 301 https://www.zmrenwu.com$request_uri;
}

server {
    charset utf-8;
    listen 443;
    server_name www.zmrenwu.com;

    ssl on;
    ssl_certificate /etc/ssl/1_www.zmrenwu.com_bundle.crt;
    ssl_certificate_key /etc/ssl/2_www.zmrenwu.com.key;

    location /static  {
        alias /home/yangxg/sites/zmrenwu.com/blogproject/static;
    }

    location /media {
        alias /home/yangxg/sites/zmrenwu.com/blogproject/media;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://unix:/tmp/zmrenwu.com.socket;
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我怎么能解决这个问题呢?

小智 14

您需要添加一个块

   location / {

   }
Run Code Online (Sandbox Code Playgroud)

此条件(对于非您的域请求):

if ( $host !~* ^(yourdomain.com|www.yourdomain.com)$ ) {
   return 444;
}
Run Code Online (Sandbox Code Playgroud)

sudo service nginx reload
Run Code Online (Sandbox Code Playgroud)


sol*_*oke 8

DisallowedHost认为,按照其他答案中的建议禁用主机警告不是正确的解决方案。Django向您发出这些警告是有原因的-最好在这些请求到达Django之前将其阻止。

您在nginx配置中创建了一个新的服务器块。因为它是您定义的唯一HTTPS服务器,所以它成为该端口的默认服务器。从文档中

default_server参数(如果存在)将使服务器成为指定address:port对的默认服务器。如果指令中都没有default_server参数,则该对中的第一台服务器address:port将是该对的默认服务器。

这解释了为什么您突然看到所有这些无效的主机错误。现在,任何尝试通过HTTPS连接到您的服务器的漫游器都将最终使用此默认服务器。由于许多漫游器将使用伪造的主机名或仅使用您的服务器IP(都不在中ALLOWED_HOSTS),因此会在Django中引起警告。

那么解决方案是什么?您可以创建一个单独的服务器块来处理所有此类无效请求:

server {
    listen 443 ssl default_server;
    server_name _;
    return 444;
}
Run Code Online (Sandbox Code Playgroud)

444是nginx用于断开无效请求的特殊响应状态。

添加此块后,它将用于与您要响应的主机头不匹配的所有请求,并且尝试与无效主机连接的任何内容将无法连接。

同时,Django将停止查看对无效主机的请求。