部署到Heroku的Django应用启用生产配置时访问出现400错误
解决Django生产配置(DEBUG=False)下的400 Bad Request错误
嘿,这个问题我之前部署Django到Heroku时也踩过坑!400错误在DEBUG=False时大多和Django的安全校验严格性有关,咱们一步步排查:
1. 先确认ALLOWED_HOSTS是否覆盖了所有访问场景
这是最常见的原因,你说已经添加了主机名,但可能漏了一些情况:
- 本地测试生产配置时:你访问的是
localhost、127.0.0.1或者[::1](IPv6)吗?这些都要加到ALLOWED_HOSTS里,比如:ALLOWED_HOSTS = ['localhost', '127.0.0.1', '[::1]'] - Heroku环境下:必须包含你的Heroku应用域名(格式是
<你的应用名>.herokuapp.com),最好从环境变量动态获取,避免硬编码:
注意:如果是测试阶段,可以临时用import os ALLOWED_HOSTS = [os.environ.get('HEROKU_APP_NAME') + '.herokuapp.com']ALLOWED_HOSTS = ['*']来验证是不是主机名的问题,但正式环境绝对不能这么做,会有安全风险!
2. 给Heroku配置SECURE_PROXY_SSL_HEADER
Heroku使用反向代理来处理请求,Django默认不会信任代理传递的协议头,导致当用户通过HTTPS访问时,Django误以为是HTTP请求,触发安全校验失败。在生产配置里加上这行:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
这会告诉Django:如果请求头里的X-Forwarded-Proto是https,就认为这是一个HTTPS请求,从而通过校验。
3. 检查环境变量是否正确加载
如果你的生产配置依赖环境变量(比如ALLOWED_HOSTS、SECRET_KEY等),要确保:
- 本地测试时:你已经在本地设置了对应的环境变量(比如用
.env文件配合python-dotenv加载) - Heroku环境下:通过
heroku config:set KEY=VALUE命令设置了正确的环境变量
比如如果你的ALLOWED_HOSTS是从环境变量读取的:
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '').split(',')
那必须确保ALLOWED_HOSTS环境变量的值是用逗号分隔的域名列表,比如localhost,127.0.0.1,myapp.herokuapp.com
4. 本地测试时避免用自定义Host头
如果你本地测试时修改了Host头(比如用curl指定非localhost的Host),但那个Host没加到ALLOWED_HOSTS里,也会触发400错误。测试时尽量用你已经添加到ALLOWED_HOSTS里的域名访问。
快速验证步骤
- 先在本地用生产配置启动服务器:
python manage.py runserver --settings=你的项目名.settings.production - 访问
http://127.0.0.1:8000,如果还是400,检查ALLOWED_HOSTS是否包含127.0.0.1 - 确认没问题后,部署到Heroku,检查Heroku的环境变量和SECURE_PROXY_SSL_HEADER配置
内容的提问来源于stack exchange,提问作者loremIpsum1771
相关产品推荐
相关产品推荐

