PHP - 不允许跨子域进行会话

时间:2014-06-12 21:30:01

标签: php session subdomain

好的,我正在处理一个我正在研究的项目的问题。我有一个包含多个子域的站点。但是,我已将每个子域设置为自己的托管帐户(这意味着它拥有自己的托管用户等)。现在,我不希望在各个域之间共享cookie。一个域是注册域(http://signup.mydomain.com),一个是登录域(http://login.mydomain.com)。但是,在他们注册后(在注册子域名上)我想强制他们登录"登录子域"。

在firefox中一切正常。但出于某种原因,在Internet Explorer中,当它们从一个子域转到另一个子域时,它不会创建新的会话。它仍然在尝试读取旧的会话文件......但是这不会起作用,因为会话文件归注册用户所有......而不是登录用户。因此我收到一个错误:open(/ tmp / sess_91757a42a3b0ff0415e07ac62e603790,O_RDWR)失败:权限被拒绝(13),这当然是有道理的,因为文件所有权问题。

现在,我无法弄清楚如何强制Internet Explorer在两个子域之间启动新会话,并将它们视为单独的站点(就像它们在技术上一样)。

以下是我尝试过的代码没有成功:

注册子域名

session_set_cookie_params(0, '/', 'signup.mydomain.com'); 
session_start();  
登录子域名

session_set_cookie_params(0, '/', 'login.mydomain.com'); 
session_start();  

然后我也试过了:

session_destroy();
$old_sessionid = session_id();
session_regenerate_id();
session_start();  

最后,我尝试了上面的不同变体,以及它(在session_start()之前:

ini_set('session.cookie_domain', 'signup.mydomain.com' );

1 个答案:

答案 0 :(得分:0)

好的,所以我想我实际上已经知道发生了什么。当我查看该网站的另一个问题时,我偶然发现了它。根域使用wordpress与防弹安全专业安全模块。事实证明,默认情况下,他们在.htaccess文件中拒绝HEAD请求:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC]
RewriteRule ^(.*)$ - [F,L]

它应该在那里阻止垃圾和垃圾邮件机器人,但显然这导致了I.E.的问题。没有发布会话。一旦我从中移除了“HEAD”,cookie就会以他们应该的方式开始工作。希望将来可以帮助其他人。