必须用中间件或控制器校验请求头,因路由层不解析请求头;推荐中间件统一处理,注意代理透传、大小写及Swoole小写化问题,务必直连测试验证。

ThinkPHP路由中如何拦截并校验请求头
直接在路由定义里做请求头校验不可行——ThinkPHP的路由层不解析请求头,route.php 中无法访问 $_SERVER 或 Request 对象。必须把校验逻辑下沉到中间件或控制器入口,否则会漏掉、误判甚至绕过。
用中间件统一校验请求头(推荐)
这是最干净、可复用的方式。新建中间件如 CheckHeaderMiddleware,在其中读取并判断关键请求头,不满足直接中断响应。
- 校验逻辑写在
handle()方法内,用$request->header('X-Api-Token')获取值,注意大小写不敏感但键名需按标准格式传 - 若校验失败,返回
json(['code'=>403,'msg'=>'Invalid header'])并调用return $response->withStatus(403) - 在
route.php中绑定中间件时,确保它在路由匹配后、控制器执行前运行,例如:Route::get('api/user', 'Api/User/index')->middleware(CheckHeaderMiddleware::class) - 避免在中间件里调用
$request->isPost()等方法后再校验头——部分 Swoole 或 CLI 环境下isPost可能干扰头读取顺序
控制器内手动校验的适用场景与风险
仅当某几个接口有特殊头要求(比如只对 /v2/pay/notify 强制要求 X-Hub-Signature-256),且不想新增中间件时才考虑。但必须在任何业务逻辑前执行,否则可能造成副作用。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在控制器方法开头立即写:
$sign = $this->request->header('X-Hub-Signature-256');,不要依赖input()或param() - 校验失败必须用
return json([...])->code(400),不能只 throw Exception——TP 默认异常页不会返回你想要的状态码 - 注意:如果开启了多应用模式,
$this->request在某些子应用初始化阶段可能尚未完全加载头信息,建议加一层isset($_SERVER['HTTP_X_HUB_SIGNATURE_256'])保底
常见踩坑点:大小写、代理转发、Swoole环境
线上出问题十次有八次是因为这个——你以为传了 X-Api-Key,实际 Nginx/Apache/Swoole 把它转成了 x_api_key 或直接丢弃。
立即学习“PHP免费学习笔记(深入)”;
- Apache 默认会过滤带连字符的头,需在
.htaccess或虚拟主机配置中加:SetEnvIfNoCase ^X-Api-Key$ "(.*)" HTTP_X_API_KEY=$1 - Nginx 需显式透传:
proxy_set_header X-Api-Key $http_x_api_key;,且注意变量名是小写下划线 - Swoole 模式下,
$request->header()返回的是原始 key 小写化后的数组,header('X-Api-Key')会找不到,应改用header('x-api-key')或遍历$request->header()查找 - 别用
getallheaders()—— 它在 CLI 和部分 FastCGI 环境下不可用,TP 底层已屏蔽该函数调用
$request->header() 被读出来,中间每层网关、反向代理、运行时是否默默做了转换或截断。每次上线前,用 curl -H "X-Api-Key: test" http://your.dev/api/test 直连 PHP-FPM 或 Swoole 进程测一遍,比看文档管用。


















