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

Codeigniter Session问题:带www的URL仍显示已销毁的旧会话

解决带www/不带www域名下会话销毁不一致的问题

这个问题我碰到过好多次了——核心原因是浏览器会把不带www的主域名(mydomain.in)和带www的子域名(www.mydomain.in)视为完全独立的两个站点。PHP的会话Cookie默认是绑定在当前请求的域名上的,所以你在mydomain.in下销毁的会话,只影响这个域名下的Cookie和会话数据,www.mydomain.in下的会话Cookie还完好存在,自然会读取旧的会话信息。

下面给你几个可行的解决方案:

1. 统一站点访问域名(最推荐)

从根源上解决问题的办法是通过服务器配置,强制所有访问请求跳转到同一个域名(要么全带www,要么全不带)。这样用户始终用同一个域名访问,会话就不会出现分裂的情况。

Apache配置(.htaccess)

如果用Apache,把这段规则放到站点根目录的.htaccess文件里:

RewriteEngine On
# 强制跳转到带www的域名
RewriteCond %{HTTP_HOST} ^mydomain\.in$ [NC]
RewriteRule ^(.*)$ http://www.mydomain.in/$1 [L,R=301]

Nginx配置

如果是Nginx,修改站点配置文件:

server {
    listen 80;
    server_name mydomain.in;
    # 301永久重定向到带www的域名
    return 301 http://www.mydomain.in$request_uri;
}

2. 让会话Cookie共享主域名

如果必须同时支持两个域名访问,那得让PHP会话Cookie绑定到主域名,这样所有子域名(包括www)都能共享同一个会话。

在调用session_start()初始化会话之前,添加这段代码:

// 注意前面的点,代表绑定到主域名及其所有子域名
ini_set('session.cookie_domain', '.mydomain.in');
session_start();

或者直接修改php.ini文件里的session.cookie_domain配置为.mydomain.in,这样全局生效。

这样不管用户访问哪个域名,都会使用同一个会话Cookie,销毁会话时两个域名下的会话都会失效。

补充:彻底销毁会话的正确步骤

另外,你现在只执行了unset($_SESSION['logged_in_user_data']),这只是销毁了会话里的一个变量,并没有彻底销毁整个会话。完整的销毁流程应该是这样的:

// 先初始化会话(如果还没启动)
session_start();

// 清空所有会话变量
$_SESSION = array();

// 销毁会话Cookie(如果存在)
if (isset($_COOKIE[session_name()])) {
    // 这里的域名要和你设置的session.cookie_domain一致
    setcookie(session_name(), '', time() - 42000, '/', '.mydomain.in');
}

// 销毁服务器端的会话数据
session_destroy();

这样才能彻底清除会话的Cookie和服务器端的会话文件,确保两个域名下都不会残留旧会话。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:34:02