【问题标题】:PHP not saving sessions on subdomain, ok on domainPHP没有在子域上保存会话,在域上可以
【发布时间】:2011-03-22 01:58:54
【问题描述】:

我们有一个 CentOS 5.4 服务器服务于我们的许多网站。服务器由 Plesk 9.2.3 管理。 我们的网站是用 php 开发的。

我们的主域 ourapplication.co.uk 位于 /var/www/vhosts/ourapplication.co.uk/httpdocs,并且 我们在 /var/www/vhosts/ourapplication/subdomains/api/httpdocs 中的子域 api.ourapplication.co.uk

以下页面位于两个位置:

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

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

【问题讨论】:

  • 我还不完全明白这一点。您是否希望将会话 cookie 从域传输到子域?
  • 不,不。 api 和主应用程序是分开的。只是我们的应用程序中使用的 cookie 很好,但是在 api.ourapplication 中设置的 cookie 没有设置。
  • 可能只是我,但在 Gumbo 的回答下,最后的评论和你的谈话之间似乎有一些交叉的谈话。 Gumbo 所说的大部分内容似乎是关于让 api.domain.com 和 domain.com 共享会话数据。如果您说问题只是 api.domain.com 根本没有保存会话 cookie,那是另一回事。
  • 你是完全正确的 - api.domain.com 和 domain.com 彼此没有连接,也不需要共享会话信息。但是,设置的(野兽)服务器似乎正在影响子域,因此 api.domain.com 没有保存会话信息。而且我不知道从哪里开始寻找。

标签: php apache session subdomain centos


【解决方案1】:

session.cookie_domain 设置为.ourapplication.co.uk(注意开头的点)以使会话cookie 对ourapplication.co.uk 及其所有子域有效。

【讨论】:

  • 不确定对此的影响。我们的 Web 服务器托管至少 4 个域,所有域都是独立的,由 apache 虚拟域提供服务(出于某种原因在不同的 IP 上,但不是我的区域)。全部用 php 开发,全部使用 cookie。因此,假设我们有 business1.co.uk、api.business1.co.uk、sellingstuff.com、werereallygreat.co.uk、anotherbusiness.com、session.cookie_domain 对大多数网站来说都是错误的。只有一个 php.ini。此外,会话适用于所有顶级域,但不适用于 plesk 生成的子域 你能进一步解释一下吗?
  • @WaveyDavey:session.cookie_domain 在任何情况下都是可变的(参见php.net/configuration.changes.modes)。因此,您可以使用php_value(参见php.net/configuration.changes)在.htaccess 文件中更改它,也可以使用已经提到的session_set_cookie_params 函数。
  • 希望成功了!在每个页面的开头我都放了 ini_set('session.cookie_domain', '.myapplication.co.uk');和一个 ini_get 显示这是采取的。但是当我访问 api.myapplication.co.uk/davidstest1.php 和 davidstest2.php 时,页面之间仍然没有传递会话信息。现在真的卡住了。
  • @WaveyDavey:哦,如果每个站点都作为自己的虚拟主机运行,它们可能不会共享相同的会话存储。您可能希望从基于文件的会话存储切换到可以从每个站点访问的数据库(请参阅php.net/session_set_save_handler)。
  • 感谢 Gumbo,但我是否认为查看处理程序应该次要于子域实际上保存任何会话状态?问题是 api.blah 有一个完全空的 $_SESSION。我仍然认为我的某些地方配置错误。
【解决方案2】:

session.cookie_domain 应该根据http://php.net/setcookie中解释的cookie域设置来设置

session_set_cookie_params() 函数常用于此

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2013-04-01
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多