PHP 会话与子域共享

发布于 2024-09-01 09:59:59 字数 632 浏览 8 评论 0原文

我读过很多关于在子域之间传递会话变量的论坛(包括这个),但我无法让它工作。有人可以解释我缺少什么吗?

步骤 1

php.ini 文件中:

session.cookie_domain = ".mydomain.example"

使用 phpinfo() 验证我使用的是正确的 php.ini 文件

步骤 2

www.mydomain 的页面中。例如设置一个会话变量$_SESSION['a'],通过在下一页上调用它来验证它是否出现(确实如此)。单击 sub.mydomain.example 的链接。

sub.mydomain.example 的第 3 步

页面检查是否使用以下方式设置了会话变量:

$a = $_SESSION['a'];
if(!isset($_SESSION['a'])){
    echo "Error: Session Variable not available";
}

不幸的是,我收到了错误消息。我缺少什么?

I have read many forums (including this one) about passing session variables between subdomains, and I can't get this to work. Can someone explain what I am missing?

Step 1

In the php.ini file:

session.cookie_domain = ".mydomain.example"

Verified with phpinfo() that I am using the right php.ini file

Step 2

In page at www.mydomain.example set a session variable $_SESSION['a'], verify that it appears by calling it on the next page (it does). Click link to sub.mydomain.example.

Step 3

Page at sub.mydomain.example checks if session variable is set using:

$a = $_SESSION['a'];
if(!isset($_SESSION['a'])){
    echo "Error: Session Variable not available";
}

Unfortunately I am getting my error message. What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱情眠于流年 2024-09-08 09:59:59

您必须将会话 ID 作为 Cookie 传递,并在新域上设置相同的会话 ID

例如,您可以使用以下代码

ini_set('session.cookie_domain', '.example.com');
$currentCookieParams = session_get_cookie_params();

$rootDomain = '.example.com';
session_set_cookie_params( 
    $currentCookieParams["lifetime"], 
    $currentCookieParams["path"], 
    $rootDomain, 
    $currentCookieParams["secure"], 
    $currentCookieParams["httponly"] 
); 

if(!empty($_SESSION)){
    $cookieName = session_id();
    setcookie('PHPSESSID', $cookieName, time() + 3600, '/', $rootDomain); 

}

if(isset($_COOKIE['PHPSESSID'])){
    session_name($_COOKIE['PHPSESSID']); 
}

You must pass the session id as a cookie and set the same session id on the new domain

For example you can use this code

ini_set('session.cookie_domain', '.example.com');
$currentCookieParams = session_get_cookie_params();

$rootDomain = '.example.com';
session_set_cookie_params( 
    $currentCookieParams["lifetime"], 
    $currentCookieParams["path"], 
    $rootDomain, 
    $currentCookieParams["secure"], 
    $currentCookieParams["httponly"] 
); 

if(!empty($_SESSION)){
    $cookieName = session_id();
    setcookie('PHPSESSID', $cookieName, time() + 3600, '/', $rootDomain); 

}

if(isset($_COOKIE['PHPSESSID'])){
    session_name($_COOKIE['PHPSESSID']); 
}
少女净妖师 2024-09-08 09:59:59

调试。
是你缺少的东西。

首先,您必须查看 HTTP 标头以了解发生了什么以及实际设置了哪些 cookie。您可以使用 LiveHTTPHeaders Firefox 插件或其他东西。有了这些信息就可以找到问题所在。没有它,没有人可以回答游览问题“我的会话不起作用”

它可以证明您在会话设置中正确设置域的声明。或者反驳它。
它可以揭示一些其他错误配置。
它可能会向您显示浏览器发回的 cookie - 因此您可以确定这是服务器端问题

查看代码的实际结果(而不是根据间接后果进行猜测)总是有帮助的。

debugging.
is the thing you're missing.

first of all you have to watch HTTP headers to see what is going on and what cookies actually being set. You can use LiveHTTPHeaders Firefox addon or something. With such info you can find the problem. Without it noone can answer tour question "my sessions don't work"

It can prove your statement of proper domain setting in the session settings. Or disprove it.
It can reveal some other misconfiguring.
It may show you cookie being sent back by the browser - so you can be sure that is server side problem

To see the actual result of your code (instead of guessing based on the indirect consequences) always helps.

埋葬我深情 2024-09-08 09:59:59

所以,我走了不同的方向并使用了这个有效的条目......

session_set_cookie_params(0, '/', '.mydomain.example');
session_start();

So, I went a different direction and used this entry which worked...

session_set_cookie_params(0, '/', '.mydomain.example');
session_start();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文