AJAX用DELETE触发ERR_HTTP2_PROTOCOL_ERROR的原因探究
问题描述
删除页面动态加载的用户记录时,通过AJAX将ID传递给PHP接口,使用DELETE方法时控制台出现错误:DELETE https://hamza786504.000webhostapp.com/admin-user-test/api/deleteUser.php net::ERR_HTTP2_PROTOCOL_ERROR,接口无有效响应;但将请求方法改为POST后,接口能正常返回结果。已知DELETE方法专为删除操作设计,想了解为何此场景下DELETE不适用,必须用POST规避问题。
相关代码
AJAX DELETE请求代码
$(document).on("click" , "#delete_button" , function(){ const id = $(this).attr("data-delete_user_id"); $.ajax({ url: "api/deleteUser.php", method: "DELETE", data : JSON.stringify({id}), success: function (data) { const res = JSON.parse(data); console.log(res); } }); })
PHP接口代码
<?php include_once("config.php"); $json = file_get_contents('php://input'); $data = json_decode($json , MYSQLI_ASSOC); if(isset($json)){ session_start(); if($_SESSION["user_id"] !== $data["id"]){ $user_id = $data["id"]; $sql = "DELETE FROM users WHERE user_id = {$user_id}"; if(mysqli_query($con , $sql)){ echo json_encode(["status" => "200" , "message" => "record deleted successfully!"]); }else{ echo json_encode(["status" => "404" , "message" => "user not found"]); } }else if($_SESSION["user_id"] == $data["id"]){ echo json_encode(["status" => "404" , "message" => "Sorry, You can not delete your own account"]); } } ?>
切换为POST方法的AJAX代码
$(document).on("click" , "#delete_button" , function(){ const id = $(this).attr("data-delete_user_id"); $.ajax({ url: "api/deleteUser.php", method: "POST", data : JSON.stringify({id}), success: function (data) { const res = JSON.parse(data); console.log(res); } }); })
原因分析
- 共享主机的HTTP方法限制:你使用的000webhost属于廉价共享主机,这类主机为简化配置、降低安全风险,通常默认只允许GET和POST两种HTTP方法,会直接拦截DELETE、PUT等方法的请求,导致出现协议错误。
- 服务器配置拦截:若为自建服务器,可能Apache或Nginx的配置中未开放DELETE方法权限,比如Apache的
<Limit>指令限制了允许的方法,或Nginx的allow_methods仅配置了GET/POST。 - HTTP/2协议兼容问题:部分环境下,DELETE请求的请求体格式或头部信息可能触发HTTP/2的协议校验逻辑,导致请求被服务器拒绝;而POST请求的格式更普遍被服务器兼容,不会触发这类校验错误。
- 请求体读取限制:虽然PHP的
php://input理论上支持读取DELETE请求的请求体,但部分服务器配置会丢弃非POST请求的请求体,不过你的错误属于协议层级,这个可能性较低。
解决方案建议
如果一定要使用DELETE方法,可尝试联系主机服务商申请开放DELETE方法权限,或自行配置服务器(如修改Apache的httpd.conf或Nginx的站点配置文件,将DELETE添加到允许的方法列表)。但对于共享主机来说,这类配置通常无法自行修改,所以用POST方法替代DELETE是更务实的选择——虽然REST规范中DELETE对应删除操作,但实际开发中,受限于环境,用POST完成删除操作是很常见的做法。
内容的提问来源于stack exchange,提问作者HamzaKhalid273
相关产品推荐
相关产品推荐

