登录后,我保存$_SESSION['user']
用户名并重定向到/dashboard/index.php
. 然后我单击菜单中的链接将我重定向到/dashboard/kanboard/index.php
我之前提到的会话变量仍然存在并正确执行必要检查的 url。问题是,如果我单击 F5 或此页面上的任何其他链接,当尝试检查会话变量是否存在时,它找不到它并返回我登录。所有这些行为都非常奇怪,因为如果我根据需要直接在第一个索引 ( /dashboard/index.php
) 中刷新多次,变量就会被正确保留。
首先,在代码的质量和清洁度受到批评之前,我不得不说它所展示的一切都是测试代码。
当将项目从使用 Debian、Apache 和 PHP 7.3.1 的 docker 容器迁移到使用 Centos 7、Apache 和 PHP 7.3.3 的 Vagrant 机器时出现此问题,因此主要问题可能不在代码本身。 Apache 或 PHP 配置。另外,之前所有的项目文件夹都在/www/html中,现在它们在/www/html/dashboard中,我也不知道它是否与它有关。
无论如何,如果出现问题,我会保留两个页面的部分代码,如果没有,我会在服务器或 PHP 配置中缺少什么?
仪表板/index.php
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
$titulo = "Index";
include $path.'/dashboard/includes/userData.php';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<?php
include $path.'/dashboard/includes/header.php';
?>
</head>
<body class="nav-md">
<div class="container body">
<div class="main_container">
<!-- sidebar menu -->
<?php
include $path.'/dashboard/includes/menu.php';
include $path.'/dashboard/includes/top-bar.php';
?>
<!-- page content -->
<div class="right_col" role="main">
</div>
<!-- /page content -->
<?php
include $path.'/dashboard/includes/footer.php';
?>
<script src="./js/index.js"></script>
<script>
$(document).ready(function() {
var index = new Index(JSON.parse('<?php echo getJSONUser()?>'));
});
</script>
</body>
</html>
仪表板/kanboard/index.php
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
$migas = "../";
$titulo = "Resumen Imputaciones";
include $path . '/dashboard/includes/userData.php';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<?php
include $path . '/dashboard/includes/header.php';
?>
<!-- MONGO Chart-->
<script src="/dashboard/vendors/Chart.js/dist/Chart.min.js"></script>
</head>
<body class="nav-md">
<!-- MODAL INFORMACION DETALLADA -->
<div class="modal" tabindex="-1" role="dialog" id="modalinfo">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" id="mtitulo"></h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="float: right;">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" id="mbody">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
</div>
</div>
</div>
</div>
<!-- FIN MODAL INFORMACION DETALLADA -->
<div class="container body">
<div class="main_container">
<!-- sidebar menu -->
<?php
include $path . '/dashboard/includes/menu.php';
include $path . '/dashboard/includes/top-bar.php';
?>
<!-- page content -->
<div class="right_col" role="main">
<div class="">
<div class="clearfix"></div>
<div class="row">
<div class="col-sm-12">
<div class="x_panel form-panel">
<div class="x_title">
<h2>Resumen Imputaciones</h2>
<div class="clearfix"></div>
</div>
<div class="x_content">
<?php
if (isAdministrator()) {
?>
<div id="tableImputaciones-loader" class="div-loader">
<i class="fa fa-spinner fa-pulse spinner"></i>
</div>
<div class="row" id="imputaciones">
<div id="tablaImputacionesContainer"
class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<table id="tableImputaciones" class="table table-striped table-bordered"
style="width:100%">
<thead id="tableImputacionesHead">
</thead>
<tbody id="tableImputacionesBody">
</tbody>
</table>
</div>
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 more-results">
<button type="button" title="Mostrar más"
class="btn btn-lg button-more-results" data-total-paginas="1"
data-tabla-ref="tableImputaciones"><i class="fa fa-angle-right"
aria-hidden="true"></i>
</button>
</div>
<input type="hidden" id="last-index"/>
</div>
<?php
}
?>
</div>
</div>
</div>
</div>
<div class="clearfix"></div>
</div>
</div>
<?php
include $path . '/dashboard/includes/modals/showUrl.php';
include $path . '/dashboard/includes/footer.php';
?>
<!-- ECharts -->
<script type="text/javascript" src="/dashboard/vendors/echarts/dist/echarts.js"></script>
<script type="text/javascript" src="/dashboard/kanboard/js/utils.js"></script>
<script type="text/javascript" src="/dashboard/kanboard/js/index.js"></script>
<script>
$(document).ready(function () {
var index = new Index('<?php echo getUserName()?>');
});
</script>
</body>
</html>
检查用户是否登录的方法
function userIsAuth()
{
// Si no hay una sesión iniciada, lo hacemos
if (! isset($_SESSION)) {
session_start();
}
// If existe la variable de sesión "user" entonces es que un usuario ha iniciado sesión
if (isset($_SESSION['user'])) {
return true;
} else {
return false;
}
}
编辑: userIsAuth 函数调用包含在所有文档中的 /dashboard/includes/userData.php 中。该函数调用 session_start();
编辑 2:我添加了 phpinfo 输出的会话配置的图像
编辑 3:我对其进行了一些更改,php.ini
以尝试尽可能地将其与项目所在的原始环境相匹配(由于环境类型和操作系统本身的某些差异除外)。此外,我现在在每一页的第一行添加了session_start()
并从 中删除了所述指令userData
。有了这个,它已经停止加载$_SESSION
以前保存的任何变量,并且还显示了 2 个新警告。
此外,我尝试更改aphp.ini
属性session.auto_start
并删除所有但所有这些都导致我使用用于检索某些数据的 API 出现不同的错误(该 api 使用 Slim Framework 并且还加载了 a )。Off
On
session_start
session_start
编辑 4:output_buffering
我已经设法通过触摸del的值来阻止警告出现php.ini
,它是 0,现在我将它设置为 4096(这似乎是推荐值)。现在我发现我$_SESSION
在记录时保存在里面的值不存在了。奇怪的是,如果在session_start();
我输入var_dump($_SESSION)
这些值之后,它们确实会出现并且错误会停止出现。
有趣的是,我发现了另一种行为。记录后,可能会出现我在编辑 4 中描述的行为,或者您可以删除编辑 3 中显示的第一个错误并$_SESSION
正确显示数据。
在看了很多天为什么整个问题可能会失败之后,最终通过在菜单中放置相对路径来解决它。
在我公开的示例中,包括以下内容之一:
其中有以下一段代码
如果我用以下内容替换它:
会话保持正确。