session_start 在使用域时未恢复会话

session_start is not resuming a session when a domain is used

我的开发环境是 Windows 上带有 Apache 和 PHP 的 VirtualBox Debian VM 运行。我目前使用特定的本地 IP 192.168.33.10 在浏览器中访问它。我创建了这两个简单的测试脚本:

stest1.php:

<?php
session_start();
$_SESSION['session_temp_id'] = 12345;
echo session_id();
?>
<a href="stest2.php">go to two</a>

stest2.php:

<?php session_start();
echo 'Session Info:';
echo session_id();
var_dump($_SESSION);
phpinfo();

如果我通过 http://192.168.33.10/stest1.php 访问它并导航到 stest2,会话将恢复并且我可以看到 ["session_temp_id"]=> int(12345) 和相同的会话 ID,因此它在直接使用 ip 时有效。

我将其设置为在本地使用特定域名,因此我将 ServerName local.mydev.com 添加到我的 apache VirtualHost 配置中,并将 192.168.33.10 local.mydev.com 添加到我的主机文件中Windows。当我访问 http://local.mydev.com/stest1.php 时,我看到了正确的页面加载,因此配置似乎正在运行。然而,导航到 stest2 为我提供了一个不同的会话 ID,其中包含 $_SESSION 的空数组。

从 chrome 开发工具中,我可以看到为 local.mydev.com 创建的 cookie,其 ID 从 stest1 持续到 stest2,但由于某种原因似乎 session_start() 不能'从该 cookie 检索会话。

这是我通过网络从 php_info 获得的会话设置:

session
Session Support enabled
Registered save handlers    files user
Registered serializer handlers  php_serialize php php_binary wddx
Directive   Local Value Master Value
session.auto_start  Off Off
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly no value    no value
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   0   0
session.gc_divisor  1000    1000
session.gc_maxlifetime  1440    1440
session.gc_probability  0   0
session.lazy_write  On  On
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /var/lib/php/sessions   /var/lib/php/sessions
session.serialize_handler   php php
session.sid_bits_per_character  5   5
session.sid_length  26  26
session.upload_progress.cleanup On  On
session.upload_progress.enabled On  On
session.upload_progress.freq    1%  1%
session.upload_progress.min_freq    1   1
session.upload_progress.name    PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix  upload_progress_    upload_progress_
session.use_cookies 1   1
session.use_only_cookies    1   1
session.use_strict_mode 0   0
session.use_trans_sid   0   0

我发现了我遇到这个问题的原因,我要承认我做了一些我不应该做的事情。我将示例修改为 'simplify' 问题。当我发布 http://local.mydev.com 时,我应该发布的是 http://local.myCompanyWebsite.com。事实证明,我们的生产网站 (https://myCompanyWebsite.com) 也有一个会话在浏览器中进行,并且 cookie 存在冲突。

我发现修改我的主机文件中的域,或在隐身模式 window 中访问 url,导致测试脚本按预期工作。

我不确定是否有办法让它们一起工作,或者是否最好只使用不同的域。我确实注意到开发 cookie 有 PHPSESSID,生产 cookie 有 __utmc。我不确定是什么原因造成的,因为这两个实例都将 PHPSESSID 列为 session.name