thinkphp5开发中session跨域(二级域名)问题的解决
在thinkphp的开发中,经常会遇到session跨域的问题,比如,在www域名下用户登陆后,用户信息保存在session,想在其他二级域名或者三级域名下同步自动登陆,获取到session里面的用户信息,默认是不行的,需要做一些配置更改和测试才行,下面我来说说。
1、打开应用目录下的配置文件,一般为 系统根目录/application/config.php,找到session配置项(如果没有,就自己添加),如下:
// +----------------------------------------------------------------------
// | 会话设置
// +----------------------------------------------------------------------
session => [
id => ,
// SESSION_ID的提交变量,解决flash上传跨域
var_session_id => ,
// SESSION 前缀
prefix => ,
// 驱动方式 支持redis memcache memcached
type => ,
// 是否自动开启 SESSION
auto_start => true,
//过期时间
expire => 24*3600*7,
domain => 您的根域名, //关键点
table_name => session,
],
其中的 domain请配置为您的根域名,即不带www的顶级域名,意思就是session的作用域为整个域名根(包含所有下级域名),就行了。
2、清空浏览器的缓存(cookie和临时文件)、清空thinkphp框架的缓存,然后测试是否生效(这里很重要,很多码农在这里扑街,发现怎么也不生效,其实是浏览器的缓存作怪,哈哈哈!)
3、如果域名经常变动怎么办呢,比如我们的erdaicms旅游网站程序,是面对各种客户的,每个客户如果都需要去手工配置,就麻烦大了,这里我在提供一段代码,如下:
$ERdaidomain=$_SERVER[SERVER_NAME];
$re_domain=;
$domain_postfix_cn_array = array("com", "net", "org", "gov", "edu", "com.cn", "cn","cc","name","info","net.cn","name","biz","top","club","red","wang","org.cn","ren","la");
$array_domain = explode(".", $ERdaidomain);
$array_num = count($array_domain) - 1;
if ($array_domain[$array_num] == cn) {
if (in_array($array_domain[$array_num - 1], $domain_postfix_cn_array)) {
$re_domain = $array_domain[$array_num - 2] . "." . $array_domain[$array_num - 1] . "." . $array_domain[$array_num];
} else {
$re_domain = $array_domain[$array_num - 1] . "." . $array_domain[$array_num];
}
} else {
$re_domain = $array_domain[$array_num - 1] . "." . $array_domain[$array_num];
}
上面的 $re_domain 为自动获取到的实时的根域名,将他赋值给session的domian就行啦