codeigniter 4 cors 失败主因有四:1. corsfilter 未处理 options 请求,需在 before() 中返回 204 响应;2. rest server 的 check_cors 未启用或配置错误;3. nginx 拦截 options 请求;4. php 提前输出导致 header 失效,应仅用 $response->setheader()。

CodeIgniter 4 的过滤器没处理 OPTIONS 请求
默认的 CorsFilter 只在 before() 钩子中设置响应头,但浏览器的预检请求(OPTIONS)根本不会走到控制器逻辑,也就不会触发任何控制器级的过滤器——它被框架在路由匹配前就截断了。结果就是:你看到控制台报错 Failed to fetch 或 Origin is not allowed,而服务端日志里甚至没有记录这次请求。
必须让过滤器显式响应 OPTIONS 方法,而不是只靠 header 注入:
- 在
CorsFilter::before()中加判断:if ($request->getMethod() === 'OPTIONS') { return $response->setStatusCode(204)->setBody(''); } - 确保
setHeader()调用在return前完成,否则头不会生效 - 不要依赖
after()钩子——预检响应必须在before()阶段完成并终止流程
CodeIgniter REST Server 的 check_cors 没启用或配置错
如果你用的是 chriskacerguis/codeigniter-restserver,光配 $config['allow_any_cors_domain'] = true 不够。它底层靠 _check_cors() 方法拦截请求,而这个方法只在 $config['check_cors'] === true 时才运行。
常见错误配置:
-
$config['check_cors'] = false(默认值),导致整个 CORS 检查被跳过 -
$config['allowed_cors_origins']是数组,但填了字符串如'*',应写成['*']或具体域名 - 用了
$config['allow_any_cors_domain'] = true却没关掉check_cors,两者冲突,实际行为不可控
验证方式:在 RestController.php 的 _check_cors() 开头加一行 log_message('debug', 'CORS checked');,看日志是否输出。
Nginx 层把 OPTIONS 请求直接拒了
即使 PHP 层配置完全正确,Nginx 也可能在到达 PHP 之前就把 OPTIONS 请求拦下,返回 405 或 403。这不是 CodeIgniter 的问题,但前端看起来一模一样。
关键检查点:
- 用
curl -X OPTIONS -I http://your-api.com/api/users看响应状态码和头,如果返回 405,说明 Nginx 没允许该方法 - 确认 Nginx
location块里有if ($request_method = 'OPTIONS') { ... return 204; },且该块不被其他deny规则覆盖 - 避免在
fastcgi_pass上方写limit_except,它会默认禁用 OPTIONS
最简可靠写法是把 OPTIONS 处理提到 location 顶部,用 add_header ... always; 确保头不被覆盖。
PHP 输出已发生,header() 失效
在 Base_Controller 构造函数或早期钩子里调 header("Access-Control-Allow-Origin: *"),很容易遇到 headers already sent 错误。CodeIgniter 4 默认启用输出缓冲,但一旦有任意空格、BOM、echo 或日志输出,缓冲就会 flush,header 就失效。
安全做法只有两个:
- 坚持用
$response->setHeader()(它是响应对象的一部分,不受输出顺序影响) - 绝对不用
header()函数,哪怕只是临时调试——CI4 的响应生命周期管理很严格,手动 header 容易脱节
特别注意:某些第三方库(如 monolog、phpspreadsheet)初始化时可能偷偷输出内容,建议在 public/index.php 开头加 ob_start(); 并确认无 BOM。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











