FrankenPHP 解决 Symfony CORS 预检请求失败

梦明姑娘_5614

梦明姑娘_5614

2026-10-08

125人浏览

原创

frankenphp默认不处理options请求,导致404或500错误;需在frankenphp.yaml中显式配置options路由并返回204响应及完整cors头,确保access-control-allow-headers包含authorization且origin精确匹配。

frankenphp 解决 symfony cors 预检请求失败

FrankenPHP 里 OPTIONS 请求被直接 404 或 500

FrankenPHP 默认不接管 OPTIONS 请求——它把这类请求当普通静态路由处理,而 Symfony 的路由没配 OPTIONS 方法时,就会 fallback 到 404 或触发未捕获异常(比如 NotFoundHttpException)。这不是 CORS 配置没生效,是请求根本没进 Symfony 的中间件链。

解决方法只有两个:要么让 FrankenPHP 提前拦截并响应 OPTIONS,要么确保 Symfony 路由显式支持 OPTIONS。推荐前者,更轻量、更可控。

  • 在 FrankenPHP 的 frankenphp.yaml 中添加 options 路由规则,匹配所有 API 路径,返回空响应 + CORS 头
  • 示例配置:
    routes:
      - path: "^/api/.*"
        methods: ["OPTIONS"]
        response:
          status: 204
          headers:
            Access-Control-Allow-Origin: "https://your-frontend.com"
            Access-Control-Allow-Methods: "GET, POST, PUT, DELETE, OPTIONS"
            Access-Control-Allow-Headers: "Content-Type, Authorization, X-Requested-With"
            Access-Control-Allow-Credentials: "true"
  • 注意:如果前端用的是 http://localhost:3000,Access-Control-Allow-Origin 必须写全,不能用 *(否则 Access-Control-Allow-Credentials: true 会失效)

Symfony 的 NelmioCorsBundle 在 FrankenPHP 下不生效

NelmioCorsBundle 依赖 Symfony 的 HTTP 内核生命周期,在 FrankenPHP 的 SAPI 模式下,某些中间件顺序或事件钩子可能被跳过——尤其是当请求被 FrankenPHP 直接短路(如命中静态文件或预检路由)时,Bundle 根本没机会运行。

别指望靠 Bundle 自动兜底。必须确认三点:

  • FrankenPHP 没把 OPTIONS 请求转发给 PHP-FPM 或 Symfony;查 frankenphp.log 看请求是否进了 index.php
  • nelmio_cors 的 paths 配置必须精确匹配实际请求路径(比如 /api/users 和 /api/users/ 是不同路径)
  • 生产环境启用 cache:clear 后,务必确认 var/cache/prod/ 下的 CORS 缓存配置已更新(Bundle 会生成缓存文件,FrankenPHP 不会自动 reload)

前端带 Authorization 头却卡在预检

错误信息通常是:Request header field authorization is not allowed by Access-Control-Allow-Headers。这说明 FrankenPHP 或 Symfony 返回的 Access-Control-Allow-Headers 响应头里漏了 Authorization。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

关键点在于:这个头必须出现在 OPTIONS 响应中,且大小写不敏感但拼写必须完全一致(authorization ≠ Authorization)。

  • FrankenPHP 配置里,Access-Control-Allow-Headers 必须显式包含 Authorization(不是 auth 或 token)
  • 如果用 NelmioCorsBundle,检查 nelmio_cors.allow_headers 是否设为 ['*'] 或明确列出 'Authorization'(注意单引号和引号类型)
  • 某些 FrankenPHP 版本对 header 值里的空格敏感,建议写成 "Content-Type,Authorization,X-Requested-With",不要换行或多余空格

开发时 localhost 端口变化导致 Origin 不匹配

前端跑在 http://localhost:5173,但某天切到 :3000,CORS 就挂了——因为 FrankenPHP 的 Access-Control-Allow-Origin 写死成一个值,或 Symfony 的 allowed_origins 没覆盖新端口。

硬编码 origin 是最常见也最隐蔽的坑。临时方案是开发期用动态判断:

  • 在 FrankenPHP 的 response.headers 里避免写死,改用 origin 变量(如果支持),或退回到 PHP 层处理
  • 若必须由 Symfony 控制,就在入口 public/index.php 开头加几行判断:
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        $origin = $_SERVER['HTTP_ORIGIN'];
        if (preg_match('/^https?:\/\/localhost(:[0-9]+)?$/i', $origin)) {
            header('Access-Control-Allow-Origin: ' . $origin);
            header('Access-Control-Allow-Credentials: true');
            exit;
        }
    }
  • 注意:这段代码必须放在任何输出之前,且不能有任何空格或 BOM 字符,否则报 headers already sent

FrankenPHP 的预检失败,往往不是 CORS 配置本身错,而是请求压根没走到能读配置的地方——先盯住 OPTIONS 是否被正确拦截,再看 header 是否完整、是否匹配、是否被覆盖。漏掉任意一环,浏览器就只给你一个红字,不解释。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10164

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6001

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2095

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3768

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4474

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3511

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4997

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3922

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11862

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习