子域间的PHP会话

时间:2017-11-12 05:40:38

标签: php session cookies subdomain azure-web-sites

我在Azure上运行了一个PHP 7应用程序,客户端在应用程序上的多个子域之间移动,但访问同一个网站。子域区分公司,一个用户与多个公司相关联。使用Cookie在这些域中跟踪用户的信息。

我的问题是,尽管两个子域中都存在相同的Cookie ID,但如果我将信息存储在a.example.com上的Cookie中,然后在b.example.com上加载相同的页面和Cookie,则不会#&# 39; t显示信息。与SO上的先前答案一致,我将Cookie设置为/上的.example.com有效。

我确实为我的应用程序启用了实例缩放,并且认为这可能导致问题,我将其关闭。但即使有一个实例,Azure仍然有两个不同的主机为不同的域提供请求 - 尽管同一个实例因此应该是相同的共享会话。

我使用下面的代码作为我在两个子域上访问的页面,该页面应该打印出我使用cookie访问过的所有子域,但它只显示当前域。

$currentCookieParams = session_get_cookie_params();

$serverParts = explode('.', $_SERVER['HTTP_HOST']);
$serverPartsCount = sizeof($serverParts);

session_set_cookie_params(
    time() + 315360000, //(10 * 365 * 24 * 60 * 60),
    '/',
    '.'.$serverParts[$serverPartsCount-2].'.'.$serverParts[$serverPartsCount-1], //equates to '.mydomain.com'
    TRUE,
    $currentCookieParams["httponly"]
);

session_start();

//use an array to track every subdomain we visit with this cookie
if (!isset($_SESSION['visitedDomains']))
{
    $_SESSION['visitedDomains'] = [];
}
$_SESSION['visitedDomains'][$_SERVER['HTTP_HOST']] = 'visited';

//show the cookie id
var_dump(session_id());
echo '<br><br>';

//the hostname of the machine serving this request
var_dump(gethostname());
echo '<br><br>';

//what should be a list of all domains visited using this cookie
var_dump($_SESSION['visitedDomains']);
echo '<br><br>';

//cookie params
var_dump(session_get_cookie_params());

1 个答案:

答案 0 :(得分:0)

您需要将session.cookie_secure设置为FLASE。这样做:

session_set_cookie_params(
    time() + 315360000, //(10 * 365 * 24 * 60 * 60),
    '/',
    '.'.$serverParts[$serverPartsCount-2].'.'.$serverParts[$serverPartsCount-1], //equates to '.mydomain.com'
    FLASE,
    $currentCookieParams["httponly"]
);

它适用于我:

enter image description here

我使用以下代码:

<?php

$currentCookieParams = session_get_cookie_params();

$serverParts = explode('.', $_SERVER['HTTP_HOST']);
$serverPartsCount = sizeof($serverParts);

echo '.'.$serverParts[$serverPartsCount-2].'.'.$serverParts[$serverPartsCount-1];
echo '<br><br>';

session_set_cookie_params(
    time() + 315360000, //(10 * 365 * 24 * 60 * 60),
    '/',
    '.'.$serverParts[$serverPartsCount-2].'.'.$serverParts[$serverPartsCount-1], //equates to '.mydomain.com'
    FALSE,
    $currentCookieParams["httponly"]
);

session_start();

//use an array to track every subdomain we visit with this cookie
if (!isset($_SESSION['visitedDomains']))
{
    $_SESSION['visitedDomains'] = [];
}

$_SESSION['visitedDomains'][$_SERVER['HTTP_HOST']] = 'visited';

//show the cookie id
var_dump(session_id());
echo '<br><br>';

//the hostname of the machine serving this request
var_dump(gethostname());
echo '<br><br>';

//what should be a list of all domains visited using this cookie
var_dump($_SESSION['visitedDomains']);
echo '<br><br>';

//cookie params
var_dump(session_get_cookie_params());