跨越同一域的子页面的PHP会话

时间:2012-07-31 21:43:03

标签: php session

我有一个域(domain.com),其中有多个子页面具有不同的会话(默认情况下),我希望其中一些子页面能够共享会话。

例如,我有domain.com/section1/staff/domain.com/section2/staff/。 我使用$_SESSION变量来存储当前登录用户的信息,我希望能够在section1/staff/中登录一次,并在我转到section2/staff/时仍然登录。

从阅读other postings看来,这似乎是会话应该工作的默认方式,并且在两个页面中都没有设置域,而session_get_cookie_params()中的路径是“/”所以它应该是相同的会话,但它不共享$_SESSION变量,即使我调用session_destroy()它也不会破坏其他会话。

有没有办法明确地将它们设置为使用相同的(或其他地方来查找不会出现在session_get_cookie_params()数组中的默认设置)?

3 个答案:

答案 0 :(得分:4)

默认情况下,PHP将对同一域中的所有脚本使用相同的会话。请注意domain.com和www.domain.com之间的互动,因为他们可能没有相同的会话。

为什么不为每个部分创建完全独立的会话,为什么不为用户和部分使用单个全局会话? $ _SESSION没有理由不能成为多维数组。

//// things needed in multiple sections could go into a common grouping:
$_SESSION['common']['user'] = 'josh';
$_SESSION['common']['privileges']['section_access'] = array( 'section1'=>"yes", 'section2'=>"no", 'section5'=>"security-prompt" );

//// while things that were section specific could be grouped by section:
$_SESSION['section1']['agreed_to_terms'] = true;

//// you could also group by logical functionality:
$_SESSION['staff']['badge_no'] = 44815;

使用这种结构,您可以在每个脚本中获得所有可用信息,但只能使用您需要的部分。

此外,这可以节省您在逻辑中处理session_name()和其他棘手位的麻烦。另外,这解决了如何在会话之间共享一些信息(例如当前用户)的问题。

答案 1 :(得分:0)

处理$_SESSION时的通常建议是确保在所有PHP脚本的顶部调用session_start();,而不是其他任何内容。

示例:

<?php // file1.php

session_start();

// other stuff...

$_SESSION['user'] = 'josh';

?>

<?php // file2.php

session_start();

// other stuff...

echo $_SESSION['user']; // should print "josh"

?>

答案 2 :(得分:0)

问题在于,一个部分强制URL到domain.com,另一部分强制它到www.domain.com。