【发布时间】:2018-03-23 09:23:18
【问题描述】:
好的.. 我有两个域 example.com 和 example.net,它们共享相同的代码空间和会话。问题是当用户改变语言时域应该改变,当这种情况发生时,所有的会话数据都会丢失。我想在此之前进行 ajax 调用,以便更改会话。 这是用于初始化会话的代码。
<?php
/* This method is invoked */
public function start($session_id = '', $key = 'default') {
if (!session_id()) {
ini_set('session.use_only_cookies', 'Off');
ini_set('session.use_cookies', 'On');
ini_set('session.use_trans_sid', 'Off');
ini_set('session.cookie_httponly', 'On');
if ($session_id) {
session_id($session_id);
}
if (isset($_COOKIE[session_name()]) && !preg_match('/^[a-zA-Z0-9,\-]{22,52}$/', $_COOKIE[session_name()])) {
exit('Error: Invalid session ID!');
}
session_set_cookie_params(0, '/');
session_start();
}
if (!isset($_SESSION[$key])) {
$_SESSION[$key] = array();
}
$this->data =& $_SESSION[$key];
return true;
}
我尝试创建一个独立的脚本来处理 ajax 调用,但它失败了。
<?php
ini_set('session.use_only_cookies', 'Off');
ini_set('session.use_cookies', 'On');
ini_set('session.use_trans_sid', 'Off');
ini_set('session.cookie_httponly', 'On');
session_set_cookie_params(0, '/');
session_start();
session_id($_POST['session_id']);
header('Content-Type: application/json');
$data = array('session_id' => session_id());
echo json_encode($data);
在两个域之间切换时不会保留会话。 有什么线索吗?
【问题讨论】:
-
域都是同一个域的子域吗?将包含域放入
session_set_cookie_params()调用中。 -
禁用
session.use_only_cookies很危险! -
@Barmar 不,它们不是子域。它们是 2 个不同的域 - example.com 和 example.net。
-
那你可能搞砸了。 Cookie 不能在不同域之间共享。你真的要使用不同的域,你不能从
example.fr重定向到fr.example.com吗? -
不,我不能使用子域。
标签: php session session-variables session-cookies