Laravel应用使用JWT时Authorization头无法传递的异常问题
嘿,这个问题我之前也碰到过!先给你吃个定心丸:Laravel本身默认是不会过滤Authorization请求头的,大概率是服务器配置、代理或者中间件的锅,下面给你梳理几个最常见的排查方向:
1. Nginx(或其他Web服务器)的配置问题
很多时候是Nginx在CGI模式下默认丢弃了Authorization头——它不会自动把这个头传递给PHP-FPM。你需要修改Nginx的站点配置,在处理PHP请求的location块里添加一行:
fastcgi_param HTTP_AUTHORIZATION $http_authorization;
另外,如果你的服务器禁用了下划线请求头(虽然Authorization没有下划线,但以防万一有相关连带影响),可以在http或server块里加上:
underscores_in_headers on;
修改完记得重启Nginx生效。
2. 反向代理下的TrustProxies中间件问题
如果你的Laravel应用部署在反向代理(比如Nginx、Cloudflare、负载均衡)后面,Laravel可能无法正确获取到原始的Authorization头——因为代理会重写请求头。这时候需要调整App\Http\Middleware\TrustProxies中间件:
// 在TrustProxies.php文件中 protected $proxies = '*'; // 测试环境可以临时用这个,生产环境建议指定具体的代理IP protected $headers = Request::HEADER_X_FORWARDED_ALL;
这样Laravel就会信任代理传递过来的请求头了。
3. 自定义/第三方中间件的干扰
检查一下你项目里的全局中间件或者路由中间件,有没有哪个中间件在处理请求时不小心移除了Authorization头?比如有些开发者会在中间件里做请求头清理,可能误删了它。你可以临时注释掉一些非必要的中间件,测试请求是否正常,逐步排查出问题所在。
4. 跨域(CORS)配置遗漏
如果是前端跨域请求,浏览器会先发送OPTIONS预检请求,这时候需要确保你的CORS配置允许Authorization头。如果你用的是barryvdh/laravel-cors包,在config/cors.php里要把Authorization加到allowed_headers数组里:
'allowed_headers' => ['Content-Type', 'Authorization'],
同时确保supports_credentials设置为true(如果请求需要带凭证的话)。
按照这个顺序排查下来,大概率能找到问题根源——先从服务器配置入手,这是最常见的原因!
内容的提问来源于stack exchange,提问作者the inquisitor

