编程语言
首页 > 编程语言> > 跨子域的PHP会话2

跨子域的PHP会话2

作者:互联网

这是PHP Sessions across sub domains的补数
我尝试了该问题上显示的内容,但发现没有给出问题.

因此,我需要跨子域(从www.example.com到forum.example.com)进行会话

我在www.example.com上所做的是

session_name("a_name");
session_set_cookie_params(0, '/', '.example.com');
session_start();

echo session_id();
$_SESSION['test'] = 123;

在forum.example.com上

session_name("a_name");
session_set_cookie_params(0, '/', '.example.com');
session_start();

echo session_id();
print_r($_SESSION);

session_id完全相同,但是$_SESSION不输出任何内容.
如何使forum.example.com输出123?

我尝试了session.cookie_domain = .example.com,但没有任何改变

当我进入forum.example.com时,它破坏了www.example.com会话,并且以另一种方式执行了相同的操作,例如是否检测到它来自另一个子域并为了安全而删除了所有内容.

这两个子域位于同一台Debian服务器上

我注意到的另一件事是,当我设置session.cookie_domain时,没有session_name和session_set_cookie_params,它仍然具有完全相同的session_id.

谢谢

解决方法:

好的,我已经考虑了一段时间了,我想我已经知道了.

首先,第一件事:由于您从两台服务器上获得了相同的会话ID,因此我们可以排除所有与Cookie相关的问题.显然,您已经在www.example.com上成功创建了一个名为a_name的cookie(尽管我叫recommend only alphanumeric characters for that cookie name),并在forum.example.com上成功读取了该a_name cookie.但是,就像您说的那样,您没有从forum.example.com获得任何数据. session.cookie_lifetime = 0并不是问题:这仅表示session cookie remains until the browser is closed.

我们应该进一步研究PHP的会话处理.您使用session_id()读取的会话ID是指服务器上的文件.通常,该文件位于/ tmp / sess_ $session_id中.该文件的内容是$_SESSION数组,已序列化. (请记住,数据是PHP中的serialize()的数据为not serialized the same way,但这并不重要.)

我认为这是与文件权限相关的问题:

> / tmp / sess_ $session_id文件是使用www.example.com的用户和组设置的.
> forum.example.com尝试打开/ tmp / sess_ $session_id,但没有适当的权限.
>结果是,当尝试print_r($_ SESSION);时,结果为空.

解:
检查服务器的配置文件,以确保www.example.com和forum.example.com以“同一用户和组”身份运行.那很关键!对于Apache,找到您的* .conf文件:

User youruser
Group yourgroup

对于nginx,找到nginx.conf:

user youruser yourgroup;

如果不能更改服务器配置文件,则应确保运行两个站点的用户在同一组中.

您可以通过以下方法首先验证www.example.com,然后通过SSH在服务器外壳中sudo ls -ltc sess_ *加载(找到以您的$session_id结尾的sess_),以验证是否存在此问题.接下来,加载forum.example.com,然后再次加载sudo ls -ltc sess_ *,以查看用户和/或组的更改.

标签:debian,cross-domain,session,php
来源: https://codeday.me/bug/20191201/2082280.html