frankenphp 依赖 caddy 配置 cors,通过 caddyfile 的 header 指令实现;开发可用通配符,生产需指定域名并启用 credentials;支持路径级控制与动态域名匹配,响应头可 curl 验证。

FrankenPHP 本身不直接处理 CORS,它依赖 Caddy 的中间件能力来添加跨域响应头。你只需要在 Caddyfile 中为对应站点配置 header 指令即可,无需 PHP 层额外干预,也不用装扩展或改框架代码。
基础跨域配置(允许所有来源)
适合开发或内部调试,简单加几行:
- 在站点块(如
yourdomain.com { ... })内添加:
header {
Access-Control-Allow-Origin "*"
Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE"
Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"
Access-Control-Expose-Headers "Content-Length,Content-Range"
}-
OPTIONS请求会自动被 Caddy 处理并返回 204,无需 PHP 路由响应预检 - 注意:生产环境避免用
"*"配合credentials(如带 cookie),此时必须指定确切域名
生产环境推荐写法(指定域名 + 支持凭证)
如果你的前端是 https://app.example.com,且需要携带 cookie 或 Authorization 头:
- 把通配符换成具体域名,并开启凭据支持:
header {
Access-Control-Allow-Origin "https://app.example.com"
Access-Control-Allow-Credentials "true"
Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE"
Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"
Access-Control-Expose-Headers "Content-Length,Content-Range"
}- 确保前端请求也设置
credentials: 'include' - 如果前端有多个域名(比如测试/正式环境),可用 Caddy 的
map或条件判断动态设置Access-Control-Allow-Origin
配合 PHP 路由做细粒度控制(可选)
某些接口需单独限制跨域,而静态资源或 API 入口统一放行。这时可以利用 Caddy 的路径匹配:
- 只对
/api/开启跨域:
yourdomain.com {
handle /api/* {
header {
Access-Control-Allow-Origin "https://app.example.com"
Access-Control-Allow-Credentials "true"
Access-Control-Allow-Methods "GET, POST, OPTIONS"
Access-Control-Allow-Headers "Content-Type,Authorization"
}
php_server
}
<pre class="brush:php;toolbar:false;">handle_static_files {
root * /var/www/public
file_server
}}
-
handle块优先级高于全局php_server,能实现路径级策略 - 非
/api/请求(如图片、JS)不会带 CORS 头,更安全
验证是否生效
用浏览器开发者工具看响应头,或命令行快速检查:
-
curl -I https://yourdomain.com/api/test,确认返回中含Access-Control-Allow-Origin - 发起带
Origin头的请求:curl -H "Origin: https://app.example.com" -I https://yourdomain.com/api/test,观察是否返回对应头
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











