You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Django收到大量陌生站点的Invalid HTTP_HOST报错告警?

Nginx配置未生效的核心原因

你添加的默认拦截server块缺少default_server标识和端口监听规则,Nginx无法识别这是处理未匹配域名请求的默认块,因此所有未知Host头的请求还是会落到你后续配置的站点server块中,转发给Django后触发ALLOWED_HOSTS校验报错。

解决方案

1. 修复Nginx默认拦截配置(根源解决报错)

将你顶部的server块替换为以下配置,覆盖HTTP和HTTPS的默认请求拦截:

# 拦截HTTP未匹配域名请求
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

# 若你配置了HTTPS服务,需额外添加以下块拦截HTTPS未匹配请求
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    # 随便填一个自签证书路径即可,仅用于完成SSL握手后返回444
    ssl_certificate /etc/nginx/ssl/default.crt;
    ssl_certificate_key /etc/nginx/ssl/default.key;
    return 444;
}

修改完成后执行命令验证配置合法性并重载Nginx生效:
sudo nginx -t && sudo systemctl reload nginx

2. 可选:停止发送该类告警邮件

如果无需接收这类Invalid HTTP_HOST报错告警,可在Django的settings.py中修改日志配置过滤这类日志:

LOGGING = {
    # 保留你原有LOGGING的其他配置,仅新增/修改以下部分
    'filters': {
        'skip_invalid_host': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': lambda record: 'Invalid HTTP_HOST header' not in record.getMessage(),
        }
    },
    'handlers': {
        'mail_admins': {
            # 保留原有mail_admins的其他配置,新增以下过滤规则
            'filters': ['skip_invalid_host'],
        }
    }
}

修改后重启Django服务即可生效。

3. 常规配置校验

确认你的Djangosettings.py中ALLOWED_HOSTS仅填写你实际使用的站点域名,不要设置为['*']避免安全风险:

ALLOWED_HOSTS = ["你的正式域名.com", "www.你的正式域名.com"]
常见疑问说明

大量陌生域名请求属于公网服务器的正常现象,是网络上的批量扫描器试探服务导致,不属于你的服务器配置错误,配置Nginx默认拦截后即可完全屏蔽这类请求。

内容的提问来源于stack exchange,提问作者Darren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:18:01