Swoole5Http 跨域处理,在 onRequest 回调设置响应头处理 OPTIONS 请求

轻芳同学_7768

轻芳同学_7768

2026-10-03

973人浏览

原创

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

swoole5http 跨域处理,在 onrequest 回调设置响应头处理 options 请求

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
Swoole 6.1.1

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 中间件在此场景下不生效

相关专题

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

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

2023.09.01

9824

6

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

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

2023.10.11

5861

5

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

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

2023.10.11

2075

5

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

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

2023.10.23

3668

4

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

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

2023.10.23

4354

6

html怎么上传
html怎么上传

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

2023.11.03

3411

9

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

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

2023.11.09

4857

8

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

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

2023.11.13

3802

8

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

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

2023.11.27

11802

4

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Swoole手册
Swoole手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习

swoole进程树解析
swoole进程树解析

共4课时 | 0.3万人学习