AJAX提交注册表单时PHP header跳转home.php失败问题求助
问题根源
- 你当前
home.php的非法访问拦截逻辑本身存在设计缺陷:依赖$_POST['sub']参数判断请求合法性,而任何重定向、刷新页面的操作都会变成GET请求,不会携带POST参数,必然会被拦截。 - 你使用AJAX做表单校验时,是异步提交表单数据,校验通过后JS跳转
home.php的行为是GET请求,自然无法满足isset($_POST['sub'])的判断条件,所以被跳回登录页。
解决方案
1. 更换为Session做登录态校验(标准方案)
这是实现页面防非法访问的通用正确方案,完全不影响你原有AJAX校验的逻辑:
- 所有需要用到登录态的PHP页面顶部都要先开启Session:
<?php session_start();
- 你的注册处理逻辑(比如
register.php)中,用户注册成功后,写入登录标记到Session:
// 注册逻辑执行完成,确认用户信息合法后 $_SESSION['is_logged'] = true; // 可选:存储用户展示需要的信息,比如用户名 $_SESSION['user_info'] = [ 'username' => $username, 'email' => $email ];
- 替换
home.php的拦截逻辑:
<?php session_start(); // 未登录则跳转回登录页 if (empty($_SESSION['is_logged']) || $_SESSION['is_logged'] !== true) { header("Location: login.php"); // 必须加exit终止后续代码执行,防止未登录用户依然能拿到页面内容 exit(); } // 下面放home.php原有业务代码
2. 调整AJAX提交逻辑
保留你原有AJAX校验、错误提示逻辑,只需要在AJAX拿到服务端返回的「注册成功」状态后,加一行JS跳转即可:
function checkEmail() { // 保留你原有的前端校验、AJAX提交逻辑 $.ajax({ url: 'register.php', type: 'POST', data: $('#mainForm').serialize(), dataType: 'json', success: function(res) { if (res.code === 0) { // 注册成功的状态码,你可以自己约定 // 校验通过后跳转首页 window.location.href = 'home.php'; } else { // 保留你原有错误提示逻辑 alert(res.msg); } } }) }
3. 可选冗余代码清理
你的提交按钮同时写了两个type属性,属于无效代码,建议修正:
<!-- 去掉重复的type="submit",用AJAX提交的话保留type="button"即可 --> <input type="button" value="Create An Account" name="sub" class="but" id="press" style="margin-top:-1px; font-family:'Rajdhani'; border: none; border-radius:25px; outline: none" onclick="checkEmail()">
内容的提问来源于stack exchange,提问作者aarushDagoat
相关产品推荐
相关产品推荐

