You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django多登录问题:主域名与www域名登录状态不互通

解决Django跨子域名登录状态不同步的问题

这问题我之前帮不少开发者解决过,核心原因是Cookie的域名范围没覆盖到子域名——当你在example.com登录时,Django默认把Session Cookie绑定在当前域名上,www.example.com属于独立的域名,自然读取不到这个Cookie,所以登录状态无法同步。下面是具体的解决步骤:

1. 配置Django的Cookie域名范围

打开你的Django项目settings.py,添加或修改以下两个配置项:

# settings.py
# 让Session Cookie对所有子域名生效
SESSION_COOKIE_DOMAIN = '.example.com'
# 同理,CSRF Cookie也要同步设置,避免跨域CSRF验证失败
CSRF_COOKIE_DOMAIN = '.example.com'

注意:域名前面的点号不能少,它表示这个Cookie对example.com及其所有子域名(包括www.example.com)都有效。

2. (可选但推荐)用Nginx统一域名跳转

为了从根源上避免用户访问不同域名的困扰,建议把其中一个域名永久重定向到另一个。比如把www.example.com重定向到example.com,修改你的Nginx配置文件:

# 处理www域名的重定向
server {
    listen 80;
    server_name www.example.com;
    # 301永久重定向到主域名
    return 301 $scheme://example.com$request_uri;
}

# 主域名的Django服务配置
server {
    listen 80;
    server_name example.com;
    # 这里放你原本的Django相关配置(比如uwsgi_pass、静态文件处理等)
}

3. 重启服务并验证

修改配置后,需要重启相关服务让设置生效:

# 重启Django应用服务(假设你用uwsgi)
sudo systemctl restart uwsgi
# 重启Nginx
sudo systemctl restart nginx

最后记得清理浏览器的Cookie和缓存,因为之前的旧Cookie还绑定在单个域名上,清除后重新登录,再分别访问两个域名测试登录状态是否同步。

额外注意点

  • 你已经在ALLOWED_HOSTS里配置了.example.com,这个是正确的,它已经包含了example.comwww.example.com,无需额外调整;
  • 如果后续配置了HTTPS,记得把SESSION_COOKIE_SECURECSRF_COOKIE_SECURE设为True,确保Cookie只通过HTTPS传输。

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

火山引擎 最新活动