PHP 会话变量在新页面上消失了吗?

PHP Session variables disappearing on new page?

首先,我将在 WampServer 中显示我的项目目录以了解我的问题。 app是PHP里面的应用,用的是Slim Framework,也许以后会变成web service(还没有)。此文件夹外的其余文件是用户的网络:

我正在 PHP 使用会话变量和 Slim Framework。在 login.php 页上,我创建了两个会话变量。这个文件不在我正在做的 Slim Framework 应用程序文件夹中。

这是文件 login.php:

<?php
session_start();

if (!empty($_SESSION) && array_key_exists("sesionIniciada", $_SESSION)) {
    if ($_SESSION["sesionIniciada"] === true) {
        header('Location: /index.php');
    } else {
        session_destroy();
        $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
        $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
    }
} else {
    session_destroy();
    $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
    $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}

?>

当变量 $_SESSION["sesionIniciada"] 不存在或为假时,我销毁会话并创建两个新变量。没问题。

在同一页面中,我在 HTML 中有一个登录表单,当我按下提交按钮时,我调用 jquery AJAX 函数进行登录。

这是Javascript中的函数:

var url = "./app/v1/acceso/web";
var data = JSON.stringify({
    usuario: $.trim($("#usuario").val()),
    clave: $.trim($("#clave").val())
});

$.ajax({
    type: "POST",
    url: url,
    data: data,
    processData: false,
    headers: {
        'S-Publica': $.trim($("#llave").val()),
        'S-Hash': encriptacion(data, $.trim($("#llave").val())),
        'Content-Type': 'application/json'
    },
    success: function (response){ 
        console.log(response);
    },
    error: function (e){
        console.log(e);
    }
});

我对这个功能没有问题,因为请求是正确的。

问题出在我通过 AJAX 调用的 PHP 文件中:var url = "./app/v1/acceso/web"。项目目录上的镜像是app/v1/index.php用路由器到link/acceso/web。在这个文件中,我试图获取我在 login.php 中创建的 $_SESSION 变量,但它们不存在!这很奇怪,因为所有项目都在同一台服务器上(而且我认为它没有 cookie ID 的问题)。

这是index.php的一部分:

<?php
session_start();

require '../libs/Slim/Slim.php';
\Slim\Slim::registerAutoloader();

$app = new \Slim\Slim(array(
    'mode' => 'debug'
    ));

$app->post('/acceso/web', function () {
    var_dump($_SESSION); //doesn't show the variables session created in login.php
});

我不知道哪里出了问题!我在想是用于 Slim 的 .htaccess 文件,但我不确定!无论如何,我发布 .htaccess 文件:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ %{ENV:BASE}index.php [QSA,L]

有什么问题吗?谢谢!

编辑:解决方案

我需要在 login.php 文件中的会话销毁后重新启动会话变量:

<?php
session_start();

if (!empty($_SESSION) && array_key_exists("sesionIniciada", $_SESSION)) {
    if ($_SESSION["sesionIniciada"] === true) {
        header('Location: /index.php');
    } else {
        session_destroy();
        session_start(); // SOLUTION
        $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
        $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
    }
} else {
    session_destroy();
    session_start(); // SOLUTION
    $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
    $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));
}

?>

感谢 Alvaro Montoro 的回答!

根据http://php.net/manual/en/function.session-destroy.php

session_destroy() destroys all of the data associated with the current session. It does not unset any of the global variables associated with the session, or unset the session cookie. To use the session variables again, session_start() has to be called.

(粗体部分是我强调我对上述问题的评论)

所以解决方案是在销毁会话后调用 session_start()

  session_destroy();
  session_start();
  $_SESSION["LLAVE_ACCESO_WEB"] = bin2hex(openssl_random_pseudo_bytes(32));
  $_SESSION["LLAVE_PUBLICA"] = bin2hex(openssl_random_pseudo_bytes(32));