$_SESSION 创建但 $_SERVER['HTTP_COOKIE'] 中没有 PHPSESSID

Posted

技术标签:

【中文标题】$_SESSION 创建但 $_SERVER[\'HTTP_COOKIE\'] 中没有 PHPSESSID【英文标题】:$_SESSION created but theres no PHPSESSID in $_SERVER['HTTP_COOKIE']$_SESSION 创建但 $_SERVER['HTTP_COOKIE'] 中没有 PHPSESSID 【发布时间】:2012-02-13 07:42:03 【问题描述】:

我的 php/Ajax 在线购物车上的 SESSION 变量遇到了一些奇怪的问题。

当我第一次查看页面时,会创建会话并在页面内运行。然后,当我导航到同一目录中的另一个 PHP 页面时,SESSION 完全丢失了。奇怪的是这只会发生一次。一旦用户在更改页面时经历了完全失去 SESSION 的过程,SESSION 就可以在整个购物车中完全发挥作用。

我开始在每个页面视图上向自己发送 $_SESSION 和 $_SERVER 数据的 var_exports。似乎第一次查看页面时,SESSION 存在并包含数据。但是 $_SERVER['HTTP_COOKIE'] 变量中没有生成 PHPSESSID。在导航到另一个页面时,会创建 PHPSESSID 并且 SESSION 将开始工作,但第一个页面视图的初始 SESSION 数据会丢失。

如果还没有为 SESSION 生成 PHPSESSID,有没有办法生成 PHPSESSID?还是这种典型行为与我的随机会话丢失问题无关?我正在使用 PHP 5.2。

购物车中的每个页面都以完全相同的方式开始:

$title="Title";
$keywords="keywords";
$description="description";
@include('../header_cart.php');

然后在 header_cart.php 的顶部有:

session_start();
if(!isset($_SESSION['active']))
    $_SESSION['active']=$_SERVER['REMOTE_ADDR'];

【问题讨论】:

各种有趣的阅读here。我不知道你是否已经检查过了。您确定您的session_start() 在您的第一次通话中没有失败吗? 购物车中的每个页面都使用相同的头文件,所以我认为不是这样。如果未设置 PHPSESSID,也许使用 session_regenerate_id() 可能会有所帮助。 但是您可能会因为会话更改而丢失购物车信息? =/ PHP 文档说“session_regenerate_id() 将用新的会话 ID 替换当前会话 ID,并保留当前会话信息。” - 我会试试看会发生什么 Josh,你说的是 php/Ajax 应用程序。您是真正访问不同的 php 页面,还是让 Ajax 拉取内容而不进行页面加载?另外,是否考虑通过 URL 传递会话 ID? 【参考方案1】:

原来它将 mydomain.com 和 www.mydomain.com 识别为单独的会话,并存储了具有 2 个不同 PHPSESSID 的 2 个 cookie。

我将此添加到我的 .htaccess 文件中,以便始终将 mydomain.com/shop 重定向到 www.mydomain.com/shop 以获取 http 和 https。

RewriteEngine On

#force http://www. to make sure SESSION data is always the same
RewriteCond %HTTPS off
RewriteCond %HTTP_HOST !^www\.
RewriteCond %REQUEST_URI shop
RewriteRule ^(.*)$ http://www.mydomain.com/shop/$1 [R,L]

#force https://www. to make sure SESSION data is always the same
RewriteCond %HTTPS on
RewriteCond %HTTP_HOST !^www\.
RewriteCond %REQUEST_URI shop
RewriteRule ^(.*)$ https://www.mydomain.com/shop/$1 [R,L]

【讨论】:

【参考方案2】:

您是否在 http: 和 https: 之间切换?它们有时被视为两个独立的域,并且它们之间可能不会共享密钥。

【讨论】:

我切换的两个页面都是http://。当我到达结帐页面时,我切换到 https://,但会话在两个 http:// 页面之间丢失了。【参考方案3】:

在调用 session_start() 之前,您是否检查过没有输出? (甚至没有空格字符!)。

在刷新任何输出后无法发送 HTTP 标头,因此可能会导致尝试告诉客户端初始会话 cookie 失败。

【讨论】:

以上是关于$_SESSION 创建但 $_SERVER['HTTP_COOKIE'] 中没有 PHPSESSID的主要内容,如果未能解决你的问题,请参考以下文章

新手 .net 问题 - 相当于 $_SESSION['SERVER_NAME'] 的变量

如何在 PHP 中为 $_SESSION 组成一个唯一的名称?

$_SESSION 变量没有保存在托管服务器上,但可以在我的本地主机上完美运行

无法注销mysql和php

存储在 $_SESSION 但显示在 $_COOKIES 数组中的值

在 AJAX 请求上为空 $_SESSION 超全局,但保留会话 ID