webman跨域配置失败主因是header()无效、corsmiddleware未注册或nginx拦截options请求;必须在中间件中用withheader()链式设置响应头,显式返回$response,并确保nginx透传options且两端均正确配置access-control-allow-credentials与origin。

Webman 中跨域配置失败,基本都是因为响应头没在正确时机、用正确方式设置——header() 无效,CorsMiddleware 没注册,或者 Nginx 拦截了 OPTIONS 请求。必须三者协同才生效。
中间件里必须用 withHeader() 设置响应头
Webman 基于 Swoole 常驻内存,传统 PHP 的 header() 调用在业务逻辑里完全不生效。所有 CORS 头必须在中间件中通过 Response 对象链式设置,并且显式返回。
- 不能写
header('Access-Control-Allow-Origin: *')—— 这行代码会被忽略 - 必须调用
$response->withHeader('Access-Control-Allow-Origin', 'https://fe.example.com') - 若需携带 Cookie,
Access-Control-Allow-Credentials必须设为true,且Access-Control-Allow-Origin不能是*,必须写死协议+域名(如https://admin.example.com) - 返回值必须是修改后的
$response,否则中间件等于没执行
必须手动注册 CorsMiddleware 到中间件链
装了 webman/cors 插件 ≠ 自动启用。它只提供类,不自动注入到请求生命周期中。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 打开
config/middleware.php,把\Webman\Cors\CorsMiddleware::class加进'default'或指定分组(如'api') - 如果只对 API 路由生效,要在路由定义里显式加
->middleware('api'),漏掉这句中间件不触发 - 顺序很重要:CORS 中间件应放在鉴权、日志等可能提前返回响应的中间件之后,否则头可能被覆盖
必须拦截 OPTIONS 预检请求并返回 204
浏览器对非简单请求(如带 Authorization 头、PUT 方法、Content-Type: application/json)会先发一次 OPTIONS 请求。Webman 若不处理,该请求会继续走完整流程,可能报错或重复执行业务逻辑。
- 在中间件
handle()中判断:if ($request->getMethod() === 'OPTIONS') - 不能直接
return ''或exit,必须构造空响应:Response::create('', 204) - 这个
204响应也得带上全部 CORS 头(Access-Control-Allow-Origin等),否则预检失败
Nginx 层必须透传 OPTIONS 并保留响应头
如果 Webman 前面套了 Nginx,而 Nginx 没配好,OPTIONS 请求根本到不了 Webman,直接被 Nginx 返回 405 Method Not Allowed 或 502。
- 在 Nginx 的
location ^~ /块里加:if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin 'https://fe.example.com'; add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS'; add_header Access-Control-Allow-Headers 'Content-Type, Authorization, X-Requested-With'; add_header Access-Control-Allow-Credentials 'true'; add_header Access-Control-Max-Age 86400; return 204; } - 若需透传后端设置的头,加
add_header ... always;,否则 Nginx 默认不转发自定义响应头 - 跨域 Cookie 场景下,还得加
proxy_cookie_domain ~\.?local$ .example.com;,否则 Cookie 域名不匹配导致前端拿不到
最容易被忽略的是:Nginx 和 Webman 两层都得设 Access-Control-Allow-Credentials: true,且 Origin 不能用 *;同时前端 fetch 必须配 credentials: 'include',三者缺一不可。少一个,Cookie 就静默丢失。










