Django 多域名部署怎么配置 ALLOWED_HOSTS 参数

文章导读
Django 多域名部署时,需在 settings.py 的 ALLOWED_HOSTS 列表中填入所有合法域名,支持使用 .example.com 格式匹配子域名。配置过宽会导致 Host 头攻击风险,配置过窄会引发 400 错误。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Django 多域名部署时,需在 settings.py 的 ALLOWED_HOSTS 列表中填入所有合法域名,支持使用 .example.com 格式匹配子域名。配置过宽会导致 Host 头攻击风险,配置过窄会引发 400 错误。

先说结论:ALLOWED_HOSTS 是 Django 防止 HTTP Host 头攻击的安全屏障,多域名场景必须显式声明所有入口域名。

  • 适合生产环境多域名解析场景
  • 先准备完整域名列表及子域名规则
  • 验收通过 curl 或浏览器访问各域名无 400 报错

快速处理思路

直接编辑 settings.py 文件,将 ALLOWED_HOSTS 修改为包含所有域名的列表。

ALLOWED_HOSTS = ['www.example.com', 'example.com', '.sub.example.com']

为什么会这样

Django 验证请求头中的 Host 字段是否在白名单内,防止恶意用户伪造 Host 头进行密码重置或缓存投毒。

当 DEBUG=False 时,Django 强制检查 ALLOWED_HOSTS,若请求的域名不在列表中,直接返回 400 Bad Request。

分步处理

第一步:登录服务器,找到项目配置目录下的 settings.py 文件。

第二步:定位 ALLOWED_HOSTS 变量,将其修改为列表格式,填入所有需要响应的域名。

第三步:若涉及子域名通配,在域名前加点号,例如 .example.com 可匹配 a.example.com 和 b.example.com。

第四步:保存文件并重启 Django 服务进程,如 gunicorn 或 uWSGI。

怎么验证是否生效

使用 curl 命令或浏览器分别访问配置的各个域名,确认页面正常加载且无 400 错误。

Django 多域名部署怎么配置 ALLOWED_HOSTS 参数

检查服务器日志,确认没有 DisallowedHost 异常记录。

curl -H "Host: www.example.com" http://服务器 IP

常见坑

生产环境严禁使用 ALLOWED_HOSTS = ['*'],这会禁用 Host 头验证保护。

域名列表区分大小写,确保配置与 DNS 解析一致,通常使用小写。

负载均衡或反向代理后,确保传递了正确的 Host 头,否则 Django 获取到的可能是内网 IP 或代理域名。

常见问题

ALLOWED_HOSTS 中加点号是什么意思?

点号表示子域名通配符,.example.com 能匹配所有三级及以上子域名。

部署后访问域名报 400 错误怎么办?

检查请求的 Host 头是否完全匹配 ALLOWED_HOSTS 中的某一项,包括端口号。

可以使用环境变量管理域名列表吗?

可以,建议通过 os.environ.get 读取环境变量,避免将敏感域名硬编码在代码库中。

参考来源

Django 官方文档 - ALLOWED_HOSTS 设置项说明

URL: https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts