部署Django到Elastic Beanstalk:Route53域名ALLOWED_HOSTS问题排查
Django部署AWS Elastic Beanstalk后www子域名400错误排查
环境与配置情况
- AWS Route53托管区域
example.com,配置2条A别名记录,均指向Elastic Beanstalk环境,对应主域名example.com和子域名www.example.com - Django应用的
ALLOWED_HOSTS配置如下:
ALLOWED_HOSTS = [ ‘env-example.eba-emvtkupp.us-west-1.elasticbeanstalk.com’, ‘example.com’, ‘www.example.com’, ‘https://example.com’, ‘https://www.example.com’, ]
问题现象
- 访问
example.com正常,但访问www.example.com时浏览器返回Bad Request (400) - 将
ALLOWED_HOSTS中的www.example.com替换为通配符.example.com后,www.example.com可正常访问,但担心通配符带来安全隐患,希望明确原配置失效的原因
核心原因分析
中文引号导致匹配失败
配置中所有域名使用的是中文单引号‘’,而非Python要求的英文单引号''。Django在验证请求的Host头时会进行严格的字符串匹配,中文引号包裹的域名与实际请求的www.example.comHost值无法匹配,直接触发400错误。无效的带协议域名配置
ALLOWED_HOSTS仅接受纯主机名(不含协议前缀),你添加的https://example.com和https://www.example.com属于无效配置,不会被Django识别,直接被忽略。
正确配置方案
修正引号格式并移除无效的带协议域名,配置如下:
ALLOWED_HOSTS = [ 'env-example.eba-emvtkupp.us-west-1.elasticbeanstalk.com', 'example.com', 'www.example.com', ]
通配符安全说明
.example.com这类通配符会匹配example.com下的所有子域名(如test.example.com、admin.example.com等),若业务无需支持所有子域名,会存在主机头伪造攻击的风险。建议始终明确指定需要支持的域名,避免使用通配符。
内容的提问来源于stack exchange,提问作者andrewhunter
相关产品推荐
相关产品推荐

