Прежде всего, я собираюсь показать свою директорию проектов в WampServer, чтобы понять мой вопрос. app
- это приложение на PHP с Slim Framework, и, возможно, в будущем он станет веб-сервисом (пока еще нет). Остальные файлы за пределами этой папке веб для пользователя:Переменные сеанса PHP исчезают на новой странице?
Я работаю в PHP с сеансовых переменных и Слим 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);
}
});
У меня нет проблем с этой функцией, потому что запрос был прав.
Проблема заключается в PHP-файле, который я вызываю через AJAX: var url = "./app/v1/acceso/web"
. В каталоге проекта изображение app/v1/index.php
с маршрутизатором по ссылке /acceso/web
. В этом файле я пытаюсь получить переменные $_SESSION
, которые я создал в login.php, но они не существуют! Это очень странно, потому что весь проект находится на одном сервере (и я полагаю, что он не имеет проблем с идентификатором файла cookie).
Это часть 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
});
Я не знаю, что это неправильно! Я думаю, это файл .htaccess, используемый для Slim, но я не уверен в этом! В любом случае я публикую файл .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ %{ENV:BASE}index.php [QSA,L]
В чем проблема? Благодаря!
EDIT: РЕШЕНИЕ
мне нужно перезапустить переменные сессии после сессии разрушающие в 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_start()' после 'session_destroy()', если вы хотите использовать переменные сеанса. Это может быть одна проблема? –
Почему вы уничтожаете сеанс, когда вы явно не сделали этого? – Slime