You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:45:38