You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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又再次设置一次,导致两次值被拼接成逗号分隔的重复内容。常见触发场景:

  1. 域名DNS配置存在重复的A/CNAME记录,导致请求被多次转发
  2. Nginx配置中存在重复的proxy_set_header Host指令
  3. 客户端或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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:55:19