首先,我要在WampServer中显示我的项目目录来理解我的问题。 app
是使用Slim Framework的PHP中的应用程序,也许将来它会成为一个Web服务(暂时还没有)。此文件夹以外的其余文件是用户网络:PHP会话变量在新页面上消失了吗?
我在PHP工作与会话变量和超薄框架。在页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
与路由器到链接/acceso/web
。 Inthis文件我试图获得我在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));
}
?>
感谢阿尔瓦罗·蒙托罗的答案!
我始终认为,如果你想使用会话变量,你必须在session_destroy()之后调用'session_start()'。这可能是一个问题吗? – 2015-02-05 20:19:46
当你明显没有完成这个任务时,你为什么要破坏会话? – Slime 2015-02-05 20:29:06