(ok)thinkphp discuz跨域情况下cookie设置无法传递,导致同步登录失败

作者: wxfeng 分类: 未分类 发布时间: 2017-09-26 00:00    阅读 1,055 次

之前记录过一篇thinkphp与discuz实现同步登录的文章《thinkphp3.2.3,discuz 同步登录实现方案》,按照文章方法在本地测试成功后,上传到线上服务器后,出现了一个问题:先在主站登录后,再访问discuz论坛可以实现登录的同步,但主站始终时未登录状态,打开firebug查看主站接收的cookie值,只有三条记录,在主站用于判断登录状态所需的cookie值都未出现,可对比以下两张图。也就是说,不管在主站还是在论坛执行登录后,主站都是无法接受到cookie值的,这样也就无法实现借用cookie进行同步登录的效果。

图片.png

图1 cookie设置在主站未生效

图片.png

图2 cookie设置在主站生效

由于同样的部署,在本地没有问题,而在线上有这个问题,所以在排查完各项参数无误后,比对线上线下的环境,只有域名时不同的,线下采用的是端口方式的部署,主站为:localhost,论坛为:localhost:83,而线上,主站是:www.myhost.com,从站是bbs.myhost.com,所以怀疑可能是跨域名导致的错误,查阅php的setcookie函数,具体用法如下

定义和用法

setcookie() 函数向客户端发送一个 HTTP cookie。

cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。

cookie 的名称指定为相同名称的变量。例如,如果被发送的 cookie 名为 "name",会自动创建名为 $user 的变量,包含 cookie 的值。

必须在任何其他输出发送前对 cookie 进行赋值。

如果成功,则该函数返回 true,否则返回 false。

语法

setcookie(name,value,expire,path,domain,secure)

 

参数 描述
name 必需。规定 cookie 的名称。
value 必需。规定 cookie 的值。
expire 可选。规定 cookie 的有效期。
path 可选。规定 cookie 的服务器路径。
domain 可选。规定 cookie 的域名
secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。

参数中domain,规定了cookie的域名,而在线上部署时,未设置此项,于是查看discuz的配置文件:/bbs/config/config_global.php,其中有这么一项,默认为空,

$_config['cookie']['cookiedomain'] = '';

抱着试试的态度,将其设置为了主站顶级域名,然后在主站登录,查看控制台,cookie值成功传递!如图2所示

$_config['cookie']['cookiedomain'] = 'myhost.com';

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。