本地localhost部署的登录系统提交时返回HTTP 405方法不允许错误
405错误核心原因
- Apache配置禁用了POST请求:httpd.conf、虚拟主机配置或项目目录下的
.htaccess文件存在Limit类规则,直接禁止了POST方法,或错误的重写规则将POST请求重定向为GET请求。 - PHP模块未正确启用:Apache未将
.php后缀的请求交给PHP模块处理,将authenticate.php识别为静态资源,静态资源默认不允许POST请求,直接返回405。 - 路径/访问方式错误:
authenticate.php文件名拼写、大小写不匹配,或你通过file://协议直接打开本地HTML文件提交请求,未走Apache的HTTP服务。
可行解决方案
- 校验访问方式:确认你是通过
http://localhost/你的项目路径/表单页面.html的方式访问登录页,不要直接双击打开本地HTML文件走file://协议。 - 检查
.htaccess规则:备份项目根目录下的.htaccess文件后将其删除,重新提交表单测试,排查是否是重写规则限制了POST方法。 - 校验Apache配置:打开XAMPP控制面板,点击Apache对应的「Config」按钮,选择
httpd.conf:- 搜索
LoadModule php_module,确认该行开头没有#注释,PHP模块已启用 - 搜索对应htdocs目录的
<Directory>配置段,确认没有<Limit POST>类的禁用规则,且配置了AllowOverride All
- 搜索
- 验证PHP解析能力:在项目目录下新建
test_post.php,写入以下代码:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { echo "POST请求正常处理"; } else { echo "当前请求方法:".$_SERVER['REQUEST_METHOD']; } ?>
新建测试表单提交到该文件,若仍返回405,直接重置XAMPP为默认配置即可解决。
- 修复代码隐藏问题:当前PHP代码存在SQL执行失败后调用空对象的逻辑漏洞,不会导致405但会引发500错误,可按如下修改:
<?php session_start(); $DATABASE_HOST = 'localhost'; $DATABASE_USER = 'root'; $DATABASE_PASS = ''; $DATABASE_NAME = 'users'; $conn = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME); if ( mysqli_connect_errno() ) { exit('Failed to connect to MySQL: ' . mysqli_connect_error()); } if ( !isset($_POST['username'], $_POST['password']) ) { exit('Please fill both the username and password fields!'); } if ($stmt = $conn->prepare('SELECT id, password FROM accounts WHERE username = ?')){ $stmt->bind_param('s', $_POST['username']); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { $stmt->bind_result($id, $password); $stmt->fetch(); if (password_verify($_POST['password'], $password)) { session_regenerate_id(); $_SESSION['loggedin'] = TRUE; $_SESSION['name'] = $_POST['username']; $_SESSION['id'] = $id; header('Location: home.php'); exit; } else { echo 'Incorrect password!.'; } } else { echo 'Incorrect username and/or password!'; } $stmt->close(); } else { exit('SQL执行错误:'.$conn->error); } ?>
内容的提问来源于stack exchange,提问作者Ric
相关产品推荐
相关产品推荐

