我在PHP / Ajax在线购物车上遇到了SESSION变量的一些奇怪问题。
当我第一次查看页面时,会创建SESSION并在页面中工作。然后,当我导航到同一目录中的另一个PHP页面时,SESSION完全丢失。奇怪的是这只发生一次。一旦用户在更改页面时完成了完全失去其SESSION的过程,SESSION将在整个购物车中完整运行。
我开始在每个页面视图上邮寄自己的$ _SESSION和$ _SERVER数据的var_exports。似乎第一次查看页面时,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 :(得分:1)
在调用session_start()之前,您是否检查过没有输出? (甚至不是白色空间的角色!)。
在刷新任何输出后无法发送HTTP标头,这可能导致尝试告诉客户端初始会话cookie失败。
答案 1 :(得分:1)
您是否在http:和https之间切换?它们有时被视为两个独立的域,并且它们之间可能不共享密钥。
答案 2 :(得分:1)
原来,它认为mydomain.com和www.mydomain.com是单独的会话,并且存储了2个带有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]