使用PHP session实现角色页面跳转时点击浏览器后退跳转错误
问题根源
你遇到的是浏览器缓存导致的问题:用户点击浏览器后退按钮时,浏览器默认直接加载本地缓存的历史页面,没有向服务器发起新请求,你写的服务端重定向逻辑根本没有被执行,因此不生效。
解决方案
1. 所有权限页添加禁用缓存的HTTP头
在所有需要登录/权限校验的页面(包括各角色专属页、登录页、登出页)的最顶部(所有输出内容之前,包括空格、HTML标签都不能在前面)添加如下代码,强制浏览器每次访问页面都向服务器发起请求:
<?php session_start(); // 所有用到session的页面必须先启动session // 禁用缓存 header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); ?>
2. 每个角色专属页面单独加权限校验
你当前的代码只是登录成功后的跳转逻辑,没有在各个角色专属页面做权限拦截。比如Admin专属的index-2.php页面顶部,必须加上如下校验逻辑,只要访问者的角色不是Admin,直接跳转:
<?php session_start(); // 禁用缓存代码这里也要加 header("Cache-Control: no-cache, no-store, must-revalidate"); header("Pragma: no-cache"); header("Expires: 0"); // 校验权限:不是Admin直接跳转到对应当前角色的首页 if(!isset($_SESSION['user_id']) || $_SESSION['role_id'] != 1){ // 可以根据当前角色跳转到对应首页,也可以统一跳登录页 if(isset($_SESSION['role_id'])){ $roleMap = [ 1 => 'index-2.php', 2 => 'index.php', 3 => 'index-lab.php', 4 => 'index-recep.php' ]; header("Location: " . $roleMap[$_SESSION['role_id']]); }else{ header("Location: login.php"); } exit; } ?>
其他角色的专属页同理,修改对应role_id的判断值即可。
3. 完善登出逻辑,彻底销毁Session
登出操作时必须彻底清空所有session数据,避免旧的角色数据残留:
<?php session_start(); // 清空session数据 $_SESSION = []; // 销毁session session_destroy(); // 清空客户端的session cookie if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 跳转到登录页 header("Location: login.php"); exit; ?>
4. 前端兜底方案(可选)
如果还是存在后退加载缓存的问题,可以在页面添加JS监听后退事件,触发时自动刷新页面走服务端校验:
window.addEventListener('pageshow', function(e) { // e.persisted为true说明是从缓存读取的页面 if (e.persisted) { window.location.reload(); } });
内容的提问来源于stack exchange,提问作者Nasik
相关产品推荐
相关产品推荐

