2012-01-18 63 views
7

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

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

我开始在每个页面视图中邮寄我自己的var _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ var数据和$ _SESSION数据。看起来,当第一次查看页面时,SESSION存在并包含数据。但是,$ _SERVER ['HTTP_COOKIE']变量中没有生成PHPSESSID。在导航到另一个页面时,PHPSESSID被创建并且SESSION将开始工作,但第一个页面视图的初始SESSION数据丢失。

如果还没有为SESSION生成PHPSESSID,有没有办法生成PHPSESSID?或者这是典型的行为,与我的随机SESSION丢失问题无关?我使用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']; 
} 
+0

阅读[这里]各种有趣(http://php.net/manual/en/function.session-id.php)。我不知道你是否已经检查过。你确定你的'session_start()'在第一次调用时没有失败吗? – afuzzyllama 2012-01-18 15:49:56

+0

购物车中的每一页都使用相同的头文件,所以我不认为就是这样。也许使用session_regenerate_id()如果没有设置PHPSESSID可能会有所帮助。 – unsunghero 2012-01-18 16:12:03

+0

但是,您可能会因为会话更改而失去购物车信息? =/ – afuzzyllama 2012-01-18 16:18:58

回答

1

原来,它将mydomain.com和www.mydomain.com识别为单独的会话,并存储了2个不同的PHPSESSID的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] 
1

你检查这之前没有输出你对session_start()的调用? (甚至没有空白字符!)。

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

1

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

+0

我在两个页面之间切换都是http://。当我到达结账页面时切换到https://,但会话在两个http://页面之间丢失。 – unsunghero 2012-01-23 13:10:40

相关问题