当使用本地域名(如 local.mydev.com)访问 php 应用时,`session_start()` 无法正确恢复已有会话,导致 `$_session` 为空、`session_id()` 变更——这通常由跨域名 cookie 冲突引起,尤其是开发域名与生产域名存在子域或主域重叠时。
在 PHP 开发中,session_start() 依赖浏览器发送的 PHPSESSID Cookie 来查找并恢复对应会话数据。看似配置无误(如 session.save_path 正确、session.use_cookies=1、session.use_only_cookies=1),但会话仍无法跨页面持续,根本原因往往不在服务端配置,而在于 Cookie 的作用域(domain scope)冲突。
从你提供的信息可知:

此时,两个不同站点(生产站与本地站)可能:
你观察到 Chrome DevTools 中 Cookie 存在且 ID 一致,正印证了这一点:Cookie 被正确发送,但服务端加载的是错误的会话数据。
避免任何与生产域名的层级关系,例如:
并在 Windows hosts 文件中添加:
192.168.33.10 mydev.local
同时确保 Apache VirtualHost 的 ServerName 与之严格一致:
ServerName mydev.local DocumentRoot /var/www/html # ... 其他配置
? 提示:.test 和 .localhost 是 IETF 预留的专用 TLD,现代浏览器默认不发送 Cookie 给其他 .test 域,安全性更高。
在 stest1.php 和 stest2.php 顶部(session_start() 之前) 强制限定 Cookie 域名:
go to two
⚠️ 注意事项:
增强 Cookie 安全边界,防止跨域携带:
虽然不能解决同域冲突,但可避免 CSRF 场景下的意外 Cookie 发送,是良好实践。
? 验证是否修复
- 使用 Chrome 无痕窗口或 Firefox 私密窗口测试(排除已有 Cookie 干扰);
- 访问 http://mydev.local/stest1.php,记录输出的 session_id();
- 点击链接跳转至 stest2.php,确认 session_id() 相同,且 var_dump($_SESSION) 显示 session_temp_id => 12345;
- 检查浏览器 Application → Cookies,确认 Domain 列显示为 mydev.local(而非 .myCompanyWebsite.com)。
? 总结
| 问题现象 | 根本原因 | 关键对策 |
|---|---|---|
| session_start() 不恢复会话,$_SESSION 为空 | 开发域名是生产主域的子域,导致 Cookie 被共享并覆盖 | ✅ 使用完全独立域名(如 mydev.local) ✅ 清除冲突 Cookie ✅ 必要时显式设置 session.cookie_domain |
切记:域名设计是会话隔离的第一道防线。与其在运行时修补 Cookie 行为,不如从源头规避域层级耦合——这是本地开发环境健壮性的基石。