thinkphp通过$request->header()方法获取请求头最稳妥,支持不区分大小写和下划线/短横线自动转换;authorization需用'authorization'键名,x-header类需用x_header格式;nginx需配置underscores_in_headers on并透传,apache需重写规则补全http_authorization。

ThinkPHP 默认不直接提供获取请求头的便捷方法,但可以通过 PHP 原生方式或框架封装的 Request 对象来获取。关键在于区分运行环境(如 Apache、Nginx、CLI 或 Swoole),因为不同环境下请求头的传递方式不同,尤其是带下划线或短横线的自定义 Header(如 X-Api-Token、Authorization)可能被 Web 服务器过滤或重命名。
使用 Request 对象获取(推荐,兼容性好)
ThinkPHP 5.1+ 和 ThinkPHP 6.x 都支持通过 think\Request 实例读取请求头:
- 在控制器中:用
$this->request->header()获取全部 Header 数组; - 获取指定 Header:
$this->request->header('token')(自动转小写,不区分大小写,支持Token、TOKEN、token); - 注意:
Authorization头需用$this->request->header('authorization'),它不会被自动忽略; - 若 Header 名含短横线(如
X-Request-ID),调用时用下划线代替:$this->request->header('x_request_id')(框架内部做了标准化转换)。
手动读取 $_SERVER(适用于特殊场景或调试)
当 Request 对象无法获取时(比如 Nginx 未透传、Swoole 环境未适配),可直接访问 $_SERVER:
- 标准 Header:如
User-Agent→$_SERVER['HTTP_USER_AGENT']; - 自定义 Header(如
X-Api-Key)→$_SERVER['HTTP_X_API_KEY']; - Authorization 头较特殊,在 Apache 下是
$_SERVER['HTTP_AUTHORIZATION'],但在 CGI/FastCGI(如部分 Nginx 配置)下可能为$_SERVER['REDIRECT_HTTP_AUTHORIZATION'],需兼容判断; - 建议封装一个安全读取函数,避免 Notice 错误:
$auth = $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? '';
检查 Web 服务器配置(常被忽略的关键点)
很多“获取不到”问题其实出在服务器层,而非代码:
-
Nginx:默认会过滤掉下划线开头或含下划线的 Header。若你发送
X_Api_Token,需在配置中开启:underscores_in_headers on;,并确保透传,例如:proxy_set_header X-Api-Token $http_x_api_token; -
Apache:通常支持良好,但启用
mod_rewrite时,Authorization 可能丢失,需添加:RewriteCond %{HTTP:Authorization} ^(.*)$RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] -
Swoole(TP6+Swoole):需确认
think-swoole扩展已正确解析 Header,自定义 Header 应以x-开头且全小写传入,框架会自动映射。
验证与调试技巧
快速定位是否是服务端问题:
- 在控制器开头加一行:
dump($this->request->header());查看实际收到的 Header; - 用
curl -H "X-Test: abc" http://your-domain.com/api/test测试基础透传; - 检查 PHP 错误日志和 Nginx/Apache access log,确认请求是否携带了对应 Header;
- 浏览器开发者工具 Network → 请求 → Headers → Request Headers,确认前端确实发出了该字段。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











