jQuery POST请求后PHP会话数据丢失

Alv*_*ndo 3 php session post

我知道这个问题看起来好像被问了很多次,但请继续阅读.

问题是,与标题建议一样,当我向另一个页面发出POST请求时,会话数据没有保存在我的PHP脚本中.

  • 是的,所有脚本都session_start();在第一行.
  • 是的,我已经检查了session_id是否相同,它是.
  • apache日志没有显示任何错误(我显示所有错误)
  • 我测试了会话是否正在创建用于创建/读取会话变量的简单页面并且它有效.当我使用POST请求时,它表现得很奇怪.

两个脚本都在同一台服务器上.

我将展示我编辑的代码,以显示它的作用.

脚本A.

<?
session_start();

echo session_id()."<br>";
print_r($_SESSION);

require_once __DIR__ . '/include/config.php';

ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);

session_set_cookie_params(
    0,
    ini_get('session.cookie_path'),
    ini_get('session.cookie_domain'),
    isset($_SERVER['HTTPS']),
    true
);

$_SESSION['haygsdb18'] = true;
$_SESSION['user_name'] = '';
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
$_SESSION['REMOTE_ADDR'] = md5($_SERVER['REMOTE_ADDR']);

$include_path =  str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);

?>

$.post(
    "<?=$include_path?>/include/ScriptB.php",
    {OTP: OTP},
    function(data) {
        alert(data);
    }
);
Run Code Online (Sandbox Code Playgroud)

脚本B

<?
session_start();

$msg = session_id()."\n";
$msg .= print_r($_SESSION,true);
exit($msg);
?>
Run Code Online (Sandbox Code Playgroud)

这样我就在调试.脚本B显示相同的会话ID,但没有会话变量.

我试图弄明白我已经失去了理智.令我吃惊的另一件事是服务器中另一个文件夹中的相同脚本(完全相同,复制粘贴)完美无缺.

请帮忙......我的想法用完了.

更新:更多调试信息

我在终端中查看sess了php创建的文件tail -f.加载脚本A时,变量将写入文件中,当进行AJAX调用时,文件将被清空(不删除,只是清空).

当脚本A执行时$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);,sess文件被写入HTTP_USER_AGENT|s:32:"2589a220583546006658f54ada687b45";,但是当脚本B执行$_SESSION['TEST'] = '1';时,sess文件中的所有内容都被替换为C1Hw6hhbpX-jWhvbRfz_reKX4tT66bcNpYGLGzxEg7I.

很多调试......发现了一个奇怪的事情

我比较了session_handler在我使用相同登录脚本的其他系统中编写sess文件的方式.在其他系统中,脚本A和脚本B正在将加密信息写入文件.问题是在这个特定的系统中,脚本A没有使用任何加密来编写文件,但脚本B是.

我怀疑脚本B期望会话信息是加密的,所以因为它不是它无法读取变量而它们已经消失了.当试图将变量从脚本B保存到脚本A时也会发生同样的情况.

所以现在我的问题是,当我没有告诉他们这样做时,脚本A和脚本B如何使用不同的session_write处理程序?我如何强迫他们使用相同的?

Alv*_*ndo 11

我终于明白了.

正如我在问题中发布的那样,问题是session_handler正在用不同的编码编写sess文件.因此,两个尝试读取文件的脚本都没有正确读取变量.

我有一个php.ini文件用于更改指令的默认字符集

default_charset = "iso-8859-1"
Run Code Online (Sandbox Code Playgroud)

我不得不使用这个指令,因为服务器管理员做了一些更改.我.user.ini在根目录中创建了一个文件以使用ISO编码,但我忘了删除此php.ini文件.

可能是charset正在搞乱编码/解码过程,因为php.ini文件只影响其中一个脚本(另一个脚本位于不同的文件夹中).所以我删除了该指令,问题就消失了.

希望这个问题能够帮助将来的某个人.