2010-07-28 26 views
0

我们有一个CentOS 5.4服务器为我们的一些网站提供服务。该服务器由Plesk 9.2.3管理。 我们的网站是用php开发的。PHP不在子域上保存会话,在域上没有问题

我们有我们在/var/www/vhosts/ourapplication.co.uk/httpdocs主域名ourapplication.co.uk,并 我们在/ var /网络/虚拟主机/ ourapplication子域api.ourapplication.co.uk /子域/ 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> 
在主域名,davidstest2在API SUBDOMAIN返回

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 

,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 

任何想法从哪里开始寻找?

+0

我完全不明白这一点。您是否期望将会话cookie从域传输到子域? – 2010-07-28 10:23:14

+0

不,不。 API和主要应用程序是分开的。只是在ourapplicatin中使用的cookis很好,但饼干在api.ourapplication没有设置。 – 2010-07-28 10:33:05

+1

它可能只是我,但在Gumbo的回答下,最后的评论和你的对话之间似乎有一些交叉目的。 Gumbo所说的大部分内容似乎是让api.domain.com和domain.com共享会话数据。如果你说问题只是说api.domain.com根本没有保存会话cookie,那么这是另一回事。 – 2010-07-28 13:56:05

回答

1

session.cookie_domain应根据Cookie域设置来设置http://php.net/setcookie解释

session_set_cookie_params()函数通常用于该

3

设置session.cookie_domain.ourapplication.co.uk(注意在开始点)有会话cookie适用于ourapplication.co.uk及其所有子域。

+0

不确定此事的影响。我们的网络服务器托管至少4个域,全部分开,由apache虚拟域(出于某种原因在不同的IP上,但不是我的区域)提供服务。所有在PHP中开发并全部使用cookies。所以,说我们有 business1.co.uk, api.business1.co.uk, sellingstuff.com, werereallygreat.co.uk, anotherbusiness.com, session.cookie_domain将是错误的大多数网站。只有一个php.ini。此外,会话适用于所有顶级域名,仅适用于plesk生成的子域名 您可以进一步解释吗? – 2010-07-28 10:35:56

+2

@WaveyDavey:* session.cookie \ _domain *在任何情况下均可更改(请参阅http://php.net/configuration.changes.modes)。所以你可以使用'php_value'在.htaccess文件中改变它(参见http://php.net/configuration.changes),或者你可以使用已经提到的'session_set_cookie_params'函数。 – Gumbo 2010-07-28 11:02:33

+0

祝您工作愉快!在每一页的开头,我把 ini_set('session.cookie_domain','.myapplication.co.uk');一个ini_get显示了这一点。但是当我访问api.myapplication.co.uk/davidstest1.php和davidstest2.php时,页面之间仍然没有传递会话信息。 现在*真*卡住了。 – 2010-07-28 12:37:06