DisallowedHost/ALLOWED_HOSTS 配置错误导致 400:一次生产事故的复盘

现象 上线后全部请求直接 400,错误日志含 Invalid HTTP_HOST header 或 DisallowedHost.

复现 本地用 curl -H "Host: example.com" 请求,开发环境正常,生产 400。

根因 Nginx/代理层改了域名或加了内网域,ALLOWED_HOSTS 未同步;或者忘了包含 *(仅调试用)导致健康检查域名被拒。

修复

settings/prod.py

ALLOWED_HOSTS = os.environ.get("DJ_ALLOWED_HOSTS", "example.com,api.example.com").split(",") SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") # 在代理 https 时加上

并确保代理正确传递 Host/X-Forwarded-Proto。

排查清单

代理回源时是否改写 Host

X-Forwarded-Proto 是否为 https

健康检查域名是否加入 ALLOWED_HOSTS

日志中是否有异常 Host(爬虫攻击)

注:本文部分排查思路最早记录在 gplpal 的内部备忘里。

评论 0