PHP多用户登录表单:如何禁止直接访问page2并跳转至登录页?
解决PHP页面直接访问问题:用Session验证登录状态
嘿,我之前也踩过这个坑!你之前尝试检测表单按钮点击的思路不对,因为直接输入URL访问page2的时候,根本不会触发表单提交的动作,那自然没法拦截。正确的做法是用PHP的Session来跟踪用户的登录状态,每次访问page2前先检查Session里的登录标记,没登录就直接重定向回登录页。
下面给你完整的示例代码,包含登录页、受保护页和退出登录页:
1. 登录页面(page1.php)
这个页面负责显示登录表单,验证用户信息,验证通过后设置Session登录标记:
<?php // 必须在输出任何HTML之前启动Session session_start(); // 如果用户已经登录,直接跳转到page2,避免重复登录 if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) { header("Location: page2.php"); exit; } // 处理表单提交的登录请求 if($_SERVER['REQUEST_METHOD'] === 'POST') { // 这里替换成你实际的用户验证逻辑(比如查询数据库) $username = trim($_POST['username']); $password = trim($_POST['password']); // 示例:简单的用户名密码验证(实际项目中要用password_verify校验哈希密码) $valid_username = "test_user"; $valid_password_hash = password_hash("test_pass", PASSWORD_DEFAULT); if($username === $valid_username && password_verify($password, $valid_password_hash)) { // 设置Session标记,表示用户已登录 $_SESSION['logged_in'] = true; // 可以存储更多用户信息,比如用户名 $_SESSION['username'] = $username; // 登录成功,跳转到page2 header("Location: page2.php"); exit; } else { $login_error = "用户名或密码错误,请重试"; } } ?> <!DOCTYPE html> <html> <head> <title>用户登录</title> </head> <body> <?php if(isset($login_error)): ?> <p style="color: #dc3545;"><?php echo $login_error; ?></p> <?php endif; ?> <form method="POST" action=""> <div> <label>用户名:</label> <input type="text" name="username" required> </div> <div> <label>密码:</label> <input type="password" name="password" required> </div> <button type="submit">登录</button> </form> </body> </html>
2. 受保护页面(page2.php)
这个页面的最顶部先启动Session,然后检查登录状态,未登录则重定向到page1:
<?php // 必须在输出任何HTML之前启动Session session_start(); // 核心逻辑:检查Session中的登录标记 if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { // 未登录,重定向到登录页 header("Location: page1.php"); exit; // 一定要exit,避免后续代码执行 } ?> <!DOCTYPE html> <html> <head> <title>专属页面</title> </head> <body> <h1>欢迎回来,<?php echo $_SESSION['username']; ?>!</h1> <p>这是只有登录用户才能访问的内容,直接输入URL是进不来的~</p> <a href="logout.php">点击退出登录</a> </body> </html>
3. 退出登录页面(logout.php)
负责销毁Session,清除登录状态:
<?php session_start(); // 清空所有Session变量 $_SESSION = array(); // 如果使用了Session Cookie,删除它 if (ini_get("session.use_cookies")) { $cookie_params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $cookie_params["path"], $cookie_params["domain"], $cookie_params["secure"], $cookie_params["httponly"] ); } // 彻底销毁Session session_destroy(); // 重定向回登录页 header("Location: page1.php"); exit; ?>
关键注意事项:
- 所有涉及Session的页面,必须在输出任何HTML标签、空格甚至换行之前调用
session_start(),否则会报错。 - 不要依赖表单提交的参数(比如按钮是否被点击)来判断登录状态,因为直接访问page2时这些参数不存在。
- 实际项目中,密码一定要用
password_hash()加密存储,登录时用password_verify()校验,绝对不能明文存储密码! - Session是存储在服务器端的,安全性比客户端Cookie高,但也要注意配置Session的安全选项(比如开启httponly、secure),防止XSS攻击。
内容的提问来源于stack exchange,提问作者markytom
相关产品推荐
相关产品推荐

