首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我将django站点从http升级到https之后,我不断收到‘无效的HTTP_HOST http’错误邮件。

在我将django站点从http升级到https之后,我不断收到‘无效的HTTP_HOST http’错误邮件。
EN

Stack Overflow用户
提问于 2017-12-16 14:09:35
回答 3查看 8.9K关注 0票数 28

最近,我将django站点从http升级到https。然而,在那之后,我不断地收到Invalid HTTP_HOST header错误电子邮件,而以前我从未收到过这样的电子邮件。

下面是一些日志消息:

Django错误(外部IP):无效的HTTP_HOST报头:'123.56.221.107‘。您可能需要在ALLOWED_HOSTS中添加'123.56.221.107‘。

Django错误(外部IP):无效的HTTP_HOST标题:'www.sgsrec.com‘。您可能需要将“www.sgsrec.com”添加到ALLOWED_HOSTS中。

Django错误(外部IP):无效的HTTP_HOST头:'sgsrec.com‘。您可能需要将“sgsrec.com”添加到ALLOWED_HOSTS中。

在/apple-app站点上报告无效的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错误(外部IP):无效的HTTP_HOST头:'pythonzh.cn‘。您可能需要将“pythonzh.cn”添加到ALLOWED_HOSTS中。

奇怪的是,我只更改我的博客站点www.zmrenwu.com nginx配置,但似乎我所有托管在123.56.221.107上的站点都已生效。

当然,我正确地设置了ALLOWED_HOSTS:

代码语言:javascript
复制
ALLOWED_HOSTS = ['.zmrenwu.com']
ALLOWED_HOSTS = ['.sgsrec.com']
ALLOWED_HOSTS = ['.pythonzh.cn']

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

代码语言:javascript
复制
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;

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-13 13:02:51

您需要添加一个块

代码语言:javascript
复制
   location / {

   }

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

代码语言:javascript
复制
if ( $host !~* ^(yourdomain.com|www.yourdomain.com)$ ) {
   return 444;
}

代码语言:javascript
复制
sudo service nginx reload
票数 20
EN

Stack Overflow用户

发布于 2017-12-17 02:19:07

在我看来,禁用另一个答案中建议的DisallowedHost主机警告并不是正确的解决方案。Django给出这些警告是有原因的,最好在这些请求到达Django之前阻止它们。

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

如果存在default_server参数,则将导致服务器成为指定address:port对的默认服务器。如果没有一个指令具有default_server参数,那么具有address:port对的第一个服务器将是这对的默认服务器。

这就解释了为什么突然看到所有这些无效的主机错误。任何试图通过HTTPS连接到您的服务器的机器人都将使用此默认服务器。由于许多机器人将使用假主机名或仅使用服务器IP (这两种都不在ALLOWED_HOSTS中),这将导致Django中的警告。

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

代码语言:javascript
复制
server {
    listen 443 ssl default_server;
    server_name _;
    return 444;
}

444是nginx对断开无效请求使用的一种特殊响应状态。

添加此块后,它将用于所有不匹配要响应的主机标头的请求,任何试图与无效主机连接的请求都将无法连接。

Django将停止查看无效主机的请求。

票数 22
EN

Stack Overflow用户

发布于 2017-12-16 16:16:04

这可能是因为可能有正在运行的bot脚本,这些脚本针对的是具有不同HTTP_HOST头的服务器(这是常见的)。在django中,允许将主机设置为特定的主机。因此,如果与允许主机中指定的主机头不同,则django将给出400错误。默认情况下,django记录器被配置为在每个错误上发送邮件。要停止获取邮件,您需要在django中配置记录器,并添加以下记录器'django.security.DisallowedHost': { 'handlers': ['null'], 'propagate': False, },

参考主机-标题-电子邮件-in-django/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47846521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档