登录后重定向至前页失败,反复跳转回登录表单求助
问题分析与解决方案
核心问题
你现在的循环跳转是因为$_SERVER['HTTP_REFERER']获取的是登录表单提交时的当前页面URL(也就是登录页自己),跳回去之后,目标页面的未登录检查又会把你重定向回登录页,形成死循环。另外代码还有几个关键问题需要修正:
具体修复步骤
1. 提前存储来源页面URL
在登录页的入口(还没处理登录逻辑的地方),把用户最初的来源页面存到session里,而不是依赖不可靠的HTTP_REFERER:
<?php include_once '../link.php'; // 仅当session未存储来源页时记录,避免重复覆盖 if (!isset($_SESSION['redirect_url'])) { // 优先记录跳转前的页面,默认跳转到主页 $_SESSION['redirect_url'] = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/index.php'; } // 后续登录处理逻辑... ?>
2. 修正Session赋值时机
你现在不管账号密码是否验证成功,都给$_SESSION['username']赋值了,这会导致未通过验证的用户也有无效session值,逻辑完全错误。必须把session赋值放到验证成功的分支里:
if (mysqli_num_rows($result) > 0) { // 验证成功后才设置有效session $_SESSION['username'] = $username; // 加载动画与跳转代码... }
3. 跳转到存储的来源页
把跳转目标改成session里存的redirect_url,跳转后记得清空这个session值,避免影响下次登录:
// 用PHP跳转更可靠(需确保在输出任何HTML前调用) unset($_SESSION['redirect_url']); header("Location: " . $_SESSION['redirect_url']); exit; // 如果坚持用JS跳转,要转义避免XSS风险 echo '<script> setTimeout(function() { window.location.href = "' . htmlspecialchars($_SESSION['redirect_url']) . '"; }, 1000); </script>'; unset($_SESSION['redirect_url']);
4. 修复SQL注入漏洞
你的SQL语句直接拼接用户输入,存在严重注入风险,必须改用预处理语句:
// 替换原查询代码 $query = "SELECT * FROM `user` WHERE username = ? AND password = ?"; $stmt = mysqli_prepare($connection, $query); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if (mysqli_num_rows($result) > 0) { // 验证成功逻辑 }
5. 检查目标页面的登录验证逻辑
确保跳转目标页面的登录检查逻辑正确,比如页面开头应该有:
include_once '../link.php'; if (!isset($_SESSION['username'])) { // 未登录则重定向到登录页 header("Location: login.php"); exit; }
额外注意事项
- PHP的
header()跳转比JS更稳定,必须在输出任何HTML内容之前调用,否则会触发错误。 - 登录成功或用户退出时,务必清空
redirect_url这个session值,避免后续登录逻辑混乱。
内容的提问来源于stack exchange,提问作者Danial K
相关产品推荐
相关产品推荐

