ThinkPHP 6 不自动解析 PATCH 请求体,需调用 $request->rawInput() 获取原始数据,再依 Content-Type 手动解析为 JSON 或表单数组;NGINX/Apache 配置不当可能导致请求体在服务器层即被截断。

ThinkPHP 6 的 request() 对象不直接支持 PATCH 参数自动解析
ThinkPHP 6 默认只对 POST、PUT、DELETE 请求自动解析请求体为参数(如 application/json 或 application/x-www-form-urlencoded),而 PATCH 被忽略——即使你发的是 JSON,$request->param() 或 $request->post() 也拿不到数据。
$request->rawInput() 是获取原始 PATCH 数据的可靠入口
必须手动读取原始请求体,再根据 Content-Type 解析。常见场景是前端用 fetch 发 PATCH + Content-Type: application/json,后端需主动处理:
-
$raw = $request->rawInput();获取原始字符串(注意:不是input()或getContent(),后者在某些 SAPI 下可能为空) - 若
$request->header('content-type')包含application/json,用json_decode($raw, true)解析 - 若为
application/x-www-form-urlencoded,可用parse_str($raw, $data) - 别依赖
$request->patch()—— ThinkPHP 没这个方法;也别用$request->post(),它对PATCH不生效
封装一个兼容 PATCH 的参数获取函数
避免每个控制器都重复判断,建议在基类或助手函数里统一处理:
function getPatchParam(\think\Request $request)
{
if ($request->method() !== 'PATCH') {
return $request->param();
}
$raw = $request->rawInput();
$contentType = $request->header('content-type', '');
if (stripos($contentType, 'application/json') !== false) {
return json_decode($raw, true) ?: [];
}
if (stripos($contentType, 'application/x-www-form-urlencoded') !== false) {
parse_str($raw, $data);
return $data;
}
return [];
}
调用时直接 getPatchParam(request()) 即可,和 $request->param() 行为一致。
立即学习“PHP免费学习笔记(深入)”;
NGINX / Apache 下 PATCH 请求体丢失的典型陷阱
部分 Web 服务器默认不转发 PATCH 的请求体,尤其当使用了反向代理或 FastCGI 时:
- NGINX:确认没配置
limit_except限制了PATCH,且client_max_body_size足够大 - Apache:检查
mod_rewrite规则是否意外把PATCH重写成GET;LimitRequestBody是否设为 0(不限制) - 最简验证法:在控制器开头加
file_put_contents('/tmp/patch.raw', file_get_contents('php://input'));,看文件是否有内容——没有就一定是服务器层截断了
真正卡住人的往往不是框架怎么写,而是请求根本没进到 PHP 进程里。



















