$ request->header('authorization') 返回空的根本原因是 web 服务器未透传 authorization 头:apache 需 setenvif 或 rewritecond 映射,nginx 需 proxy_set_header authorization $http_authorization 或 fastcgi_pass_request_headers on;框架内必须用小写键名 'authorization'。

中间件里 $request->header('authorization') 返回空,不是代码写错了,而是 Web 服务器根本没把头传进来——得先让 Apache/Nginx 把 Authorization 头透传给 PHP,再谈读取。
为什么 $request->header('authorization') 总是空
ThinkPHP 内部统一把 header 键转为小写,所以必须用 'authorization',不能写 'Authorization' 或 'bearer'。但更大概率是:Web 服务器压根没把该头交给 PHP。
Apache 默认剥离 Authorization;Nginx 默认不透传 $http_authorization;PHP-FPM 在 CGI 模式下也不会自动填充 $_SERVER['HTTP_AUTHORIZATION']。此时 $request->header() 必然为空,和框架无关。
Apache 环境下必须加 SetEnvIf 或 RewriteCond
在 .htaccess 或虚拟主机配置中加入以下任一方案(推荐前者):
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
或
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
这两段的作用都是把原始请求头映射为 $_SERVER['HTTP_AUTHORIZATION'],之后 ThinkPHP 才能通过 $request->header('authorization') 正常读取。漏掉这步,中间件永远拿不到值。
Nginx 环境下要配 proxy_set_header
如果你用 Nginx 做反向代理(比如对接 PHP-FPM),必须显式透传:
proxy_set_header Authorization $http_authorization;
注意不是 $sent_http_authorization,也不是 $http_Authorization(大小写敏感)。如果 Nginx 直接跑 PHP(非 proxy),还需确认是否启用了 fastcgi_pass_request_headers on;,否则 $_SERVER 里照样没有 HTTP_AUTHORIZATION。
中间件里安全提取 Bearer Token 的写法
即使头传进来了,也不能直接 explode(' ', $auth)[1]——客户端可能发 Bearer xxx(多个空格)、bearer xxx(小写)、甚至 Basic xxx(非 JWT 场景)。建议这样写:
- 用
trim($request->header('authorization'))去首尾空格 - 判断前缀是否为
'Bearer '(注意末尾带空格),再用substr($auth, 7)截取 token - 避免用
strtok()或正则,简单明确最可靠 - 如果返回 null 或空字符串,就该直接返回 401,别往下走鉴权逻辑
脱敏记录时也别存完整 token,用 substr($token, 0, 10) . '***' 即可。
真正卡住人的从来不是中间件怎么写,而是 Web 服务器那几行配置没加对——漏掉任意一环,$request->header('authorization') 就永远是空的,后面所有逻辑都白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











