frankenphp下symfony无法读取authorization头,主因是其fastcgi网关默认剥离该头;须在frankenphp.yaml或caddyfile中显式配置env: redirect_http_authorization: "${http_authorization}",并在symfony中优先读取$_server['redirect_http_authorization']。

FrankenPHP 下 Symfony 无法读取 Authorization 请求头
FrankenPHP 默认不会将 Authorization 请求头透传给 PHP 应用,哪怕前端明确发送了 Authorization: Bearer xxx,$_SERVER['HTTP_AUTHORIZATION'] 和 getallheaders() 都为空。这不是 Symfony 配置问题,而是 FrankenPHP 的 FastCGI 网关行为:它沿用了传统 PHP-FPM 的头过滤逻辑,把敏感头直接剥离了。
必须在 FrankenPHP 配置中启用 auth header 透传
FrankenPHP 不像 Nginx 那样靠 fastcgi_pass_request_headers on 控制,它的透传行为由 php_value 指令或 .phpstorm.meta.php 类配置驱动。关键动作是显式声明允许的头:
- 在项目根目录的
frankenphp.yaml(或Caddyfile中 PHP 路由块)里添加:env: PHP_VALUE: "cgi.fix_pathinfo=1\nalways_populate_raw_post_data=-1\nvariables_order=EGPCS"
- 更重要的是,在
frankenphp.yaml的server或application区块中加入:env: REDIRECT_HTTP_AUTHORIZATION: "${HTTP_AUTHORIZATION}" - 若使用 Caddy v2.8+,在 PHP handler 中加:
php_fastcgi * { env HTTP_AUTHORIZATION {http.request.header.Authorization} }
Symfony 层需兼容 FrankenPHP 的头存放位置
FrankenPHP 不会把 Authorization 写入 $_SERVER['HTTP_AUTHORIZATION'],而是转存为 $_SERVER['REDIRECT_HTTP_AUTHORIZATION'](和 Apache + mod_rewrite 行为一致)。Symfony 默认的 Request::getHeader('authorization') 依赖 getallheaders(),而该函数在 FrankenPHP 下不可靠。
- 不要依赖
apache_request_headers()—— 它在 FrankenPHP 中始终返回空数组 - 在自定义认证逻辑(如
Authenticator)中,改用硬编码提取:$auth = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? $_SERVER['HTTP_AUTHORIZATION'] ?? null;
- 若使用
symfony/security-http的BearerTokenExtractor,它默认只查HTTP_AUTHORIZATION,需包裹一层适配器,手动 fallback 到REDIRECT_HTTP_AUTHORIZATION
跨域场景下 OPTIONS 预检失败会掩盖真实问题
如果你的前端是跨域调用(比如 Vite 开发服务器),浏览器先发 OPTIONS 预检;若响应没带 Access-Control-Allow-Headers: Authorization,预检就卡住,后续请求根本不会发出——此时你看到的“没 Authorization”其实是 CORS 拦截,不是 FrankenPHP 或 Symfony 没收到。
- 确保 Symfony 的 CORS 配置(
nelmio_cors或手动响应头)明确包含:access_control_allow_headers: ['Authorization', 'Content-Type']
- FrankenPHP 的
frankenphp.yaml里不能只配 PHP 环境变量,CORS 响应头必须由 Symfony 或 Caddy 输出;别指望.htaccess或 Apache 规则生效 - 用
curl -v -H "Origin: http://localhost:5173" -X OPTIONS http://localhost:8000/api/login验证预检是否返回 200 + 正确头
FrankenPHP 的头处理比传统 FPM 更“干净”,也更严格——它不会自动做 Apache 那套 REDIRECT_ 前缀映射,除非你明确定义。最容易被忽略的是:即使配置了 env: REDIRECT_HTTP_AUTHORIZATION,若没在 Symfony 请求对象创建前执行(比如放在中间件之后),依然拿不到值。务必把头提取逻辑放在 Kernel::handle() 入口或第一个事件监听器里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











