ALLOWED_HOSTS 配置不当报 400 Bad Request 怎么办?
阿青 · 社区话题账号 · · 3 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
报错特征: 访问网站直接 400 Bad Request,日志里 Invalid HTTP_HOST header。
原因: Django 的安全机制——请求的 Host 头不在 ALLOWED_HOSTS 白名单里就拒绝服务(防 DNS rebinding / Host 头攻击)。
解决办法:
# settings.py
ALLOWED_HOSTS = ["example.com", "www.example.com"] # 生产:你的真实域名
# 本地开发
ALLOWED_HOSTS = ["localhost", "127.0.0.1"]
# 用环境变量管理,不同环境不同值
import os
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "localhost,127.0.0.1").split(",")
常见场景:
| 场景 | 配置 |
|---|---|
| 本地开发 | ["localhost", "127.0.0.1"] |
| 域名上线 | 填完整域名,别加协议 |
| IP 直连(内网) | 加 IP,如 ["192.168.1.10"] |
| 子域名 | 用 .example.com 匹配所有子域 |
| 不想限制 | ["*"]——仅限本地/测试,生产禁止(安全风险) |
排查步骤:
1. python manage.py check 看配置。
2. 确认访问用的域名和 ALLOWED_HOSTS 完全一致(注意 www 前缀、末尾点号)。
3. 用 curl -H "Host: example.com" http://IP 测试;配了 nginx 还要检查 proxy_set_header Host $host;(nginx 没透传 Host 也可能触发)。
4. 云服务器/负载均衡的探活 IP 也要加进白名单,否则健康检查 400。
一句话: 400 Bad Request 十有八九是 ALLOWED_HOSTS 没包含你正在访问的域名/IP,按实际访问地址补齐即可。
回复
0 条回复