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.com和www.example.com,无需额外调整; - 如果后续配置了HTTPS,记得把
SESSION_COOKIE_SECURE和CSRF_COOKIE_SECURE设为True,确保Cookie只通过HTTPS传输。
内容的提问来源于stack exchange,提问作者user9612506




