You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 2对接CodeIgniter API请求失败,跨域Header报错求助

解决Angular 2 + CodeIgniter 跨域请求中的content-type头报错问题

这个错误是典型的CORS(跨域资源共享)预检失败问题:当你的Angular前端发送POST请求时,默认会带上Content-Type: application/json请求头,浏览器会先发起一个OPTIONS预检请求,检查后端是否允许这个头。而你的CodeIgniter后端目前只声明允许X-Requested-With,所以预检不通过,请求被浏览器拦截了。

具体修复方案:

1. 更新CodeIgniter的跨域响应头并处理OPTIONS请求

修改你的API处理函数,把Content-Type加入允许的请求头列表,同时专门处理OPTIONS预检请求(直接返回204状态码即可):

public function index() {
    // 优先处理OPTIONS预检请求,避免后续逻辑执行
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header("HTTP/1.1 204 No Content");
        exit();
    }

    // 更新跨域允许的请求头,添加Content-Type
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Headers: X-Requested-With, Content-Type');
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS');

    // 注意:Angular默认发送JSON格式数据,不能用$this->input->post()获取
    $requestData = json_decode(file_get_contents('php://input'), true);
    print_r($requestData);
}

2. 为什么要修改数据获取方式?

Angular的http.post默认发送的是JSON格式的请求体,而CodeIgniter的$this->input->post()只能解析application/x-www-form-urlencoded或multipart/form-data格式的表单数据,所以需要用file_get_contents('php://input')读取原始请求体,再解码成JSON数组。

3. 可选优化:全局配置跨域头

如果你的API有多个接口,不想每个方法重复写跨域头,可以把配置放在控制器的构造函数里:

public function __construct() {
    parent::__construct();
    
    // 全局设置跨域头
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Headers: X-Requested-With, Content-Type');
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS');

    // 全局处理OPTIONS请求
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header("HTTP/1.1 204 No Content");
        exit();
    }
}

这样所有接口都会自动应用跨域配置,不用重复编写。

修改完成后重新测试,你的Angular请求应该就能正常通过CORS预检,成功和后端交互了。

内容的提问来源于stack exchange,提问作者Kmg Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:42:43