我们有一台 CentOS 5.4 服务器,为我们的多个网站提供服务。该服务器由 Plesk 9.2.3 管理。我们的网站是用 php 开发的。
我们的主域名 ourapplication.co.uk 位于 /var/www/vhosts/ourapplication.co.uk/httpdocs,子域名 api.ourapplication.co.uk 位于 /var/www/vhosts/ourapplication/subdomains/api/httpdocs
以下页面位于两个位置:
davidstest1.php
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<title>Code Blue Stats</title>
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
<?php
echo "This is Davids Test 1. It will set SESSION['davids']='davids variable set' and then link
to davidstest2.php<br />
davidstest2 wil then do a session_start() call, and attempt to display SESSION['davids'] <br />";
$_SESSION['davids']='davids variable set';
?>
<a href="davidstest2.php">davidstest2.php</a>
</body>
</html>
davidstest2.php
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<title>Code Blue Stats</title>
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
<?php
echo "This is Davids Test 2. It will do a session_start() call, and attempt to display SESSION['davids'] <br />";
$r=print_r($_SESSION, true);
echo "<pre>Session in <br />";
echo $r;
echo "<br /></pre>";
?>
<a href="davidstest2.php">davidstest2.php</a>
</body>
</html>
在 MAIN 域中,davidstest2 返回
This is Davids Test 2. It will do a session_start() call, and attempt to display SESSION['davids']
Session in
Array
(
[siteMode] => none
[davids] => davids variable set
)
davidstest2.php
在 api SUBDOMAIN 中,davidstest2 返回
This is Davids Test 2. It will do a session_start() call, and attempt to display SESSION['davids']
Session in
Array
(
)
davidstest2.php
显然,Apache 配置或 Php 配置中存在错误,因为会话变量应该存储在两个域中
Relevant phpinfo() reports:
Session Support enabled
Registered save handlers files user
Registered serializer handlers php php_binary wddx
session.auto_start Off Off
session.bug_compat_42 Off Off
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/lib/php/session /var/lib/php/session
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off Off
session.use_trans_sid 0 0
有什么想法从哪里开始寻找吗?
答案1
文件在服务器上的位置并不重要。要确保会话 cookie 对域及其子域都可用,请使用 php 函数session_set_cookie_params并设置领域适当参数:
Cookie 域,例如“www.php.net”。要使 Cookie 在所有子域上可见,则域必须以点为前缀,如“.php.net”。
注意:
您需要在每个请求中调用 session_set_cookie_params(),并且在调用 session_start() 之前调用
所以您的脚本应该包含这个,或者您可以选择在您的 php.ini 文件中明确设置 cookie 域。
答案2
Cookies 无法跨不同的主机名起作用(实际上这并不完全正确,但是真正的答案会花费我太多时间来输入)。
如果您必须有多个主机名,那么请使用单点登录解决方案。
C。
答案3
我将验证会话的 cookie 域是否设置正确。运行 session_get_cookie_params ( void )。这将返回一个数组,其中包含 cookie 将在其中发挥作用的域。