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

AWS Lightsail上Django应用非www域名400错误求助

解决AWS Lightsail上Django应用裸域访问400错误的方案

我之前在Lightsail部署多Django应用时也碰到过类似的问题,结合你的场景,给你几个针对性的排查和解决步骤:

1. 先确认域名解析(DNS)配置是否正确

第一个应用的裸域firstapp.com能正常访问,说明你的Lightsail实例IP是没问题的,但第二个应用的secondapp.com可能存在DNS记录缺失或错误:

  • 登录你的域名服务商后台,检查secondapp.com的A记录(或CNAME记录)是否指向了和www.secondapp.com相同的Lightsail实例IP;
  • 可以在本地终端用命令验证:dig secondapp.com,对比返回的IP和dig www.secondapp.com的结果是否一致。如果不一致,赶紧修正DNS记录,等待生效(通常需要10-30分钟)。

2. 检查Web服务器(Nginx/Apache)的站点配置

绝大多数Django部署都会用Nginx做反向代理,这是最容易出问题的环节:

  • 打开第二个应用的Nginx配置文件(通常在/etc/nginx/sites-available/或/etc/nginx/conf.d/目录下),查看server_name字段是否同时包含裸域和www域名:
    server {
        listen 80;
        # 必须同时包含两个域名
        server_name secondapp.com www.secondapp.com;
    
        # 以下是常规反向代理配置,确保保留Host头
        location / {
            proxy_pass http://127.0.0.1:8000; # 对应你的Django应用端口
            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;
        }
    }
    
  • 如果是用Apache,需要在VirtualHost配置里添加ServerAlias secondapp.com,确保同时覆盖两个域名;
  • 修改配置后,记得重启Web服务器:sudo systemctl restart nginx(Nginx)或sudo systemctl restart apache2(Apache)。

3. 确保Django配置真正生效

虽然你已经设置了ALLOWED_HOSTS = ['*'],但可能存在配置未更新的情况:

  • 重启你的应用服务器(比如Gunicorn或uWSGI),比如用systemd管理的Gunicorn:sudo systemctl restart gunicorn;
  • 如果是通过环境变量设置ALLOWED_HOSTS,检查第二个应用的环境变量是否正确配置了secondapp.com(比如在.env文件里),并且应用服务器能读取到这个变量。

4. 排查HTTPS/SSL相关配置(如果启用了HTTPS)

如果你的应用配置了SSL证书(比如Let's Encrypt),可能裸域的证书或重定向规则有问题:

  • 确保你的SSL证书同时覆盖了secondapp.com和www.secondapp.com(申请证书时要同时包含两个域名);
  • 如果配置了强制HTTPS重定向,要确保裸域的HTTP请求也能被正确重定向到HTTPS,比如在Nginx里添加:
    server {
        listen 80;
        server_name secondapp.com www.secondapp.com;
        return 301 https://$host$request_uri;
    }
    
  • 同时,在Django的settings.py里添加以下配置,确保能识别反向代理传递的HTTPS头:
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    

5. 查看日志定位具体原因

如果以上步骤都没解决问题,直接看日志找线索:

  • 查看Django的错误日志,通常在应用目录下的logs文件夹,或者通过Web服务器的日志(比如Nginx的/var/log/nginx/error.log),看看访问secondapp.com时的具体错误信息;
  • 400错误虽然提示Host不允许,但有时候可能是请求头异常(比如Host头被篡改),日志里会明确显示Django收到的Host值,根据这个值再调整配置。

内容的提问来源于stack exchange,提问作者Elchin Kocharli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:03:47