You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录后重定向至前页失败,反复跳转回登录表单求助

问题分析与解决方案

核心问题

你现在的循环跳转是因为$_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:13:14