CodeIgniter前后端分离跨域问题本质是浏览器同源策略拦截,解决核心思路为后端配置CORS或前端代理。推荐开发用CORS过滤器、调试用入口修改、开发阶段用Vite/Webpack代理、生产环境用Nginx反向代理。

CodeIgniter项目做前后端分离时,跨域问题本质是浏览器同源策略拦截了前端(如 Vue/React)发往 CI 后端的 Ajax 请求。解决核心思路只有两个:要么让后端主动声明允许跨域(CORS),要么让请求“看起来”没跨域(代理)。下面分场景讲清楚怎么落地。
后端配置 CORS(推荐用于开发和测试环境)
CodeIgniter 4 默认不开启跨域响应头,需手动添加。最稳妥的方式是通过过滤器统一处理:
- 新建文件 app/Filters/CorsFilter.php,写入标准响应头设置
- 在 app/Config/Filters.php 中注册该过滤器,并设为全局前置(
before) - 重点注意:
Access-Control-Allow-Origin不建议直接写*(尤其涉及 Cookie 或认证时),应明确指定前端域名,例如http://localhost:5173 - 若前端带凭证(如 cookies 或 Authorization header),必须同时设
allowCredentials(true),且allowedOrigins不能为*
修改核心请求入口(快速验证用)
适合临时调试或简单接口,不推荐长期使用。直接在 system/CodeIgniter.php 的 handleRequest() 前插入判断:
- 检测请求方法是否为
OPTIONS,若是则立即返回 200 并设置 CORS 头 - 对非 OPTIONS 请求,在正常响应前补上
Access-Control-Allow-Origin等头 - 这种方式绕过路由和过滤器,但耦合度高,升级框架时易被覆盖
前端开发阶段用 Vite/Webpack 代理(零后端改动)
仅限本地开发,生产环境不可用。原理是让前端开发服务器(如 Vite)把 /api 开头的请求转发给 CI 后端,浏览器实际只和前端同源通信:
- Vite 中配置
server.proxy,例如将/api代理到http://localhost:8000(CI 运行地址) - 前端 axios/fetch 请求路径写成
/api/user/login,而非完整 URL - 注意
changeOrigin: true必须开启,否则 Host 头不匹配可能导致 CI 拒绝请求
生产环境用 Nginx 反向代理(最安全稳定)
上线后真正推荐的做法:让 Nginx 统一接收所有请求,把 API 路径反向代理到 CI 服务,前端完全感知不到后端存在:
- 前端静态资源(HTML/JS/CSS)由 Nginx 直接 serve
- 所有以
/api/开头的请求,Nginx 转发给http://127.0.0.1:8000(CI 的监听地址) - 无需后端任何 CORS 设置,因为请求全程发生在同源(都是 Nginx 域名+端口)
- 还能顺便做 gzip、缓存、HTTPS 终止等优化


















