swoole 5 http服务器处理跨域需手动设置cors头并拦截options请求:1. 设置access-control-allow-origin(非*)、allow-methods、allow-headers、allow-credentials和max-age;2. 在onrequest中判断method为options时立即响应200并end()。

Swoole 5 的 HTTP 服务器在处理跨域请求时,必须在 onRequest 回调中主动设置 CORS 响应头,并拦截并响应 OPTIONS 预检请求。这不是自动行为,漏掉任一环节都会导致前端请求被浏览器拒绝。
必须设置的关键 CORS 响应头
浏览器判断是否允许跨域,依赖以下响应头。建议按需精确配置,避免用 * 开放全部(尤其涉及 Cookie 时):
-
Access-Control-Allow-Origin:设为具体前端域名(如
https://admin.example.com),带凭据时不能为* -
Access-Control-Allow-Methods:列出实际支持的方法,如
GET, POST, PUT, DELETE, PATCH, OPTIONS -
Access-Control-Allow-Headers:包含前端实际发送的自定义头,常见有
Content-Type, Authorization, X-Requested-With, token -
Access-Control-Allow-Credentials:如需携带 Cookie 或认证信息,必须设为
true,且此时Allow-Origin不能是* -
Access-Control-Max-Age(可选):缓存预检结果时间(秒),减少重复 OPTIONS 请求,例如
86400
必须拦截并立即响应 OPTIONS 请求
非简单请求(如含 Authorization 头、Content-Type: application/json)会触发浏览器先发 OPTIONS。若未正确响应,后续真实请求根本不会发出。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
在 onRequest 中需显式判断并终止流程:
- 检查
$request->server['request_method'] === 'OPTIONS' - 设置上述所有 CORS 头(包括
Allow-Origin等) - 调用
$response->status(200)并$response->end(),不执行业务逻辑
完整 onRequest 示例(Swoole 5)
以下代码可直接用于 Swoole 5 HTTP Server 的回调中:
public function onRequest($request, $response) {
// 设置通用 CORS 头(对所有请求生效)
$origin = $request->header['origin'] ?? '';
$allowedOrigins = ['https://localhost:3000', 'https://admin.example.com'];
$accessOrigin = in_array($origin, $allowedOrigins) ? $origin : '';
$response->header('Access-Control-Allow-Origin', $accessOrigin);
$response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
$response->header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, token');
$response->header('Access-Control-Allow-Credentials', 'true');
$response->header('Access-Control-Max-Age', '86400');
// 拦截 OPTIONS 预检请求
if ($request->server['request_method'] === 'OPTIONS') {
$response->status(200);
$response->end();
return;
}
// 正常业务处理(仅对非 OPTIONS 请求执行)
$this->app->swoole($request, $response);
}
注意事项与常见坑点
实际部署中容易忽略但影响严重的问题:
-
Origin 校验不可省略:直接写死
Allow-Origin: *在需要凭证时会导致失败;应动态校验并回传匹配的 Origin -
OPTIONS 响应不能遗漏任何 CORS 头:浏览器会严格比对预检响应中的
Allow-Headers和实际请求头,不匹配即报错 -
响应头顺序无关,但大小写敏感:确保拼写完全正确(如
Access-Control-Allow-Origin不可写成access-control-allow-origin) -
不依赖中间件或框架自动处理:Swoole 是底层服务器,CORS 必须在
onRequest中手动控制,Laravel/Symfony 等框架的 CORS 中间件在此场景下不生效










