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

PHP实现登出后点击浏览器返回按钮跳转至登录页

解决登出后返回按钮跳转问题的方案

我来帮你搞定这个问题!你遇到的情况是因为浏览器缓存了samp2.php的页面,登出后点击返回时,浏览器直接加载本地缓存的页面,而不是重新向服务器请求。同时原代码里samp2.php没有先检查会话是否有效就直接使用$_SESSION['session_var_user'],所以会触发未定义索引的报错。

下面是具体的修改方案:

1. 修改samp2.php,添加会话检查与缓存控制

把samp2.php的代码改成这样:

<?php
session_start();

// 检查用户是否已登录,未登录则直接跳转到登录页
if(!isset($_SESSION['session_var_user'])){
    header("Location: samp.php");
    exit(); // 确保后续代码不再执行
}

// 设置响应头,禁止浏览器缓存当前页面
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
header("Pragma: no-cache"); // HTTP 1.0
header("Expires: 0"); // 过期时间设为过去,强制浏览器不缓存

echo "Hi," . $_SESSION['session_var_user'];

if(isset($_POST['logout'])) {
    // 清空会话变量
    $_SESSION = array();
    // 销毁会话
    session_destroy();
    // 跳转到登录页
    header('Location: samp.php');
    exit();
}
?>
<form action = "samp2.php" method="post">
<input type="submit" name="logout" value="logout">
</form>

关键修改点说明:

  • 会话检查:在页面最开始就判断$_SESSION['session_var_user']是否存在,如果不存在直接跳转到登录页,这样就算浏览器返回加载页面,服务器也会强制跳转,不会出现报错。
  • 缓存控制头:这三个头会告诉浏览器不要缓存当前页面,下次返回时必须重新向服务器请求,这样服务器就能执行会话检查的逻辑,而不是加载缓存的旧页面。
  • 登出逻辑优化:登出时先清空$_SESSION数组,再销毁会话,确保当前请求里的会话变量也被清除,避免后续代码意外使用旧值。

2. 额外建议:修复SQL注入风险

顺便提一句,你当前samp.php里的SQL查询存在严重的SQL注入风险,直接把用户输入的$username和$password拼进SQL语句里,很容易被攻击。建议改成预处理语句:

修改samp.php里的查询部分:

// 替换原来的查询代码
$stmt = $conn->prepare("SELECT * FROM tbl_name WHERE col_userName = ? AND col_custPass = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();

if(mysqli_num_rows($result)==1) {
    $_SESSION['session_var_user'] = $username;
    header('Location:samp2.php');
    exit();
} else {
    echo "Username or password mismatch";
}

这样能有效防止SQL注入,让你的代码更安全。

内容的提问来源于stack exchange,提问作者mgunner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:06:25