PHP LDAP认证登录后重定向index.php失败 Session异常排查
LDAP认证登录后重定向回首页失败排查方案
问题现象
访问index.php时可正常跳转至登录页login.php,但输入正确LDAP凭据验证通过后,无法正常跳转回index.php首页。
问题相关代码
index.php
<?php session_start(); if(!isset($_SESSION['user'])) { // 未登录用户重定向到登录页 header("Location: http://192.168.0.20:8090/login.php"); exit; } ?>
login.php
<?php include("authenticate.php"); // 处理登出逻辑 if(isset($_GET['out'])) { // 销毁会话 session_unset(); $_SESSION = array(); unset($_SESSION['user'],$_SESSION['access']); session_destroy(); } // 处理登录表单提交 if(isset($_POST['userLogin'])){ // 调用认证方法校验凭据 if(authenticate($_POST['userLogin'],$_POST['userPassword'])) { // 认证通过重定向到首页 header("Location: http://192.168.0.20:8090/index.php"); die(); } else { // 认证失败标记错误 $error = 1; } } // 输出错误提示 if(isset($error)) echo "Login failed: Incorrect user name, password, or rights<br />"; // 输出登出成功提示 if(isset($_GET['out'])) echo "Logout successful"; ?>
排查步骤(按出现概率从高到低排序)
- 最高发问题:
login.php缺少session_start()调用
你的index.php头部调用了session_start()才能读取会话数据,但login.php全文件没有启动会话的逻辑。哪怕认证函数里写了$_SESSION赋值,没有启动会话的话数据根本不会持久化。登录成功跳回index.php时,服务端生成新会话发现$_SESSION['user']不存在,会立刻重定向回登录页,表面看就是重定向失败、甚至死循环。
修复方式:直接在login.php最顶部、所有业务逻辑之前加上session_start();,位置要在include("authenticate.php")前面。 - 检查
authenticate()函数是否正确写入登录态
打开authenticate.php确认,认证通过的逻辑分支里必须有对$_SESSION['user']的赋值操作,比如$_SESSION['user'] = $_POST['userLogin'];。如果认证通过后根本没设置这个键值,index.php的登录判断永远不通过,自然会反复跳回登录页。
注意:如果在authenticate.php里操作$_SESSION,也要保证执行到相关代码时已经调用过session_start(),否则赋值不生效。 - 检查重定向头发送前是否有提前输出
PHP的header()函数必须在所有实际输出之前调用,否则会直接报错失效。需要检查两个点:login.php、authenticate.php的PHP起始标记<?php之前不能有空格、BOM头、HTML内容,文件末尾的?>标记建议直接删除,避免尾随空格造成意外输出- 如果开启了错误显示,认证过程中抛出的Warning、Notice级错误也会提前输出内容,导致重定向头发送失败。可以临时在认证通过分支注释掉重定向代码,加
var_dump(headers_sent());调试,返回true就说明存在提前输出,逐行定位清理即可。
- 检查会话存储权限
如果前面的配置都没问题,查看php.ini中session.save_path配置的目录,是否给Web服务的运行用户(apache、nginx、www-data等)开放了读写权限。权限不足时会话数据无法写入磁盘,每次请求都会生成新的会话ID,登录态自然丢失。
内容的提问来源于stack exchange,提问作者Mathis
相关产品推荐
相关产品推荐

