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
我的开发环境是 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