我在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());
答案 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"]
);
它适用于我:
我使用以下代码:
<?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());