Django部署遇DisallowedHost错误:HTTP_HOST头部重复问题求助
问题:HTTP_HOST头部重复导致Django DisallowedHost错误
我在AWS EC2上部署了Django应用,通过公网IP可正常访问。在Namecheap购买域名www.myproject.com替换IP后,执行Gunicorn命令gunicorn –bind 127.0.0.1:8001 wsgi:application时遇到DisallowedHost错误,错误显示HTTP_HOST头部为重复的www.myproject.com,www.myproject.com,不符合RFC 1034/1035规范。
错误回溯
DisallowedHost at / Invalid HTTP_HOST header: 'www.myproject.com,www.myproject.com'. The domain name provided is not valid according to RFC 1034/1035. Request Method: GET Request URL: http://www.myproject.com,www.myproject.com/ Django Version: 5.1.1 Exception Type: DisallowedHost Exception Value: Invalid HTTP_HOST header: 'www.myproject.com,www.myproject.com'. The domain name provided is not valid according to RFC 1034/1035. Exception Location: /home/ubuntu/myproject/.venv/lib/python3.12/site-packages/django/http/request.py, line 151, in get_host Raised during: transcribe_audio.views.index Python Executable: /home/ubuntu/myproject/.venv/bin/python3 Python Version: 3.12.3 Python Path: ['/home/ubuntu/myproject/e', '/home/ubuntu/myproject/.venv/bin', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/home/ubuntu/myproject/.venv/lib/python3.12/site-packages', '/home/ubuntu/myproject'] Server time: Sun, 13 Oct 2024 13:37:50 +0000
NGINX配置
server { listen 80; server_name myproject.com www.myproject.com; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /path/to/your/static/files; } location / { proxy_pass http://127.0.0.1:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Django settings.py配置
ALLOWED_HOSTS = ['myproject.com', 'www.myproject.com', 'localhost', '127.0.0.1', '1.21.3.14.1']
已尝试操作
- 检查NGINX配置是否存在问题
- 验证Namecheap上的域名DNS记录配置正确
- 确认ALLOWED_HOSTS中的域名无误
原因及解决方法
成因分析
HTTP_HOST头部重复的核心原因是请求到达Nginx时,原始请求已携带Host头部,而Nginx的proxy_set_header Host $host又再次设置一次,导致两次值被拼接成逗号分隔的重复内容。常见触发场景:
- 域名DNS配置存在重复的A/CNAME记录,导致请求被多次转发
- Nginx配置中存在重复的
proxy_set_header Host指令 - 客户端或CDN层额外添加了Host头部
解决步骤
1. 修改Nginx的Host头部配置
将Nginx配置中的proxy_set_header Host $host;替换为以下两种方案之一:
# 方案一:使用原始请求的Host头部(存在则用,不存在则 fallback 到$host) proxy_set_header Host $http_host; # 方案二:直接指定固定域名,彻底避免拼接问题 proxy_set_header Host www.myproject.com;
修改后重启Nginx生效:
sudo systemctl restart nginx
2. 检查DNS记录是否重复
登录Namecheap后台,确认:
myproject.com和www.myproject.com的A/CNAME记录仅存在一条,无重复配置- 记录指向的EC2公网IP正确,无错误跳转设置
3. 验证Gunicorn绑定方式
确保Gunicorn仅监听本地端口,避免直接暴露公网:
gunicorn --bind 127.0.0.1:8001 wsgi:application
4. 临时调试(可选)
在Django视图中添加日志,查看原始请求头部,进一步定位问题:
import logging logger = logging.getLogger(__name__) def index(request): logger.info(f"Raw Host header: {request.META.get('HTTP_HOST')}") logger.info(f"X-Forwarded-Host: {request.META.get('HTTP_X_FORWARDED_HOST')}") # 原有视图逻辑
内容的提问来源于stack exchange,提问作者beeeZeee
相关产品推荐
相关产品推荐

