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

如何在Yii2框架中配置允许跨域资源共享(CORS)?

PHP配置CORS跨域解决方案

通用原生PHP配置

直接在PHP业务代码输出内容前,添加以下响应头设置即可,适配所有PHP项目:

// 允许跨域的源,开发测试可填*,生产环境请替换为你的前端实际域名(如http://localhost:5500)
header("Access-Control-Allow-Origin: *");
// 允许的请求方法
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
// 允许的请求头
header("Access-Control-Allow-Headers: Content-Type, Authorization");
// 如果前端请求需要携带Cookie,需加上下面这行,同时上面的Allow-Origin不能为*
// header("Access-Control-Allow-Credentials: true");

// 处理OPTIONS预检请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    // 预检请求直接返回空响应,状态码200即可
    http_response_code(200);
    exit;
}

// 你的原有业务代码
$result = file_get_contents('http://m2m.exemys.com/...');
var_dump($result);

Yii2框架专用配置

如果用Yii2框架,更推荐用框架内置的CORS行为处理,不需要手动写header:

单控制器配置

在你对应的控制器中添加behaviors方法配置CORS过滤器:

public function behaviors()
{
    $behaviors = parent::behaviors();
    // 优先处理CORS,需要放在认证过滤器之前
    $behaviors['corsFilter'] = [
        'class' => \yii\filters\Cors::class,
        'cors' => [
            // 允许的源,规则同上
            'Origin' => ['*'],
            'Access-Control-Request-Method' => ['GET', 'POST', 'OPTIONS'],
            'Access-Control-Request-Headers' => ['*'],
            // 允许带Cookie的话打开下面配置
            // 'Access-Control-Allow-Credentials' => true,
            'Access-Control-Max-Age' => 86400, // 预检请求缓存时间,单位秒
        ],
    ];
    return $behaviors;
}

// 你的原有业务方法
public function actionIndex()
{
    $result = file_get_contents('http://m2m.exemys.com/...');
    \Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
    return $result;
}

全局配置(可选)

如果要给所有接口都开启CORS,可以在config/web.php的组件配置中添加:

return [
    // 其他配置...
    'components' => [
        'response' => [
            'on beforeSend' => function ($event) {
                $response = $event->sender;
                $response->headers->set('Access-Control-Allow-Origin', '*');
                $response->headers->set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
                $response->headers->set('Access-Control-Allow-Headers', 'Content-Type');
                if (\Yii::$app->request->getMethod() == 'OPTIONS') {
                    $response->statusCode = 200;
                    $response->content = '';
                }
            },
        ],
    ],
];

注意事项

  • 生产环境禁止使用*作为允许源,必须填写前端的实际访问域名,避免安全风险
  • 所有CORS头配置必须在业务内容输出前执行,不能有任何提前输出的内容(如echo、空格、PHP文件末尾的多余换行等)
  • 你的前端AJAX代码不需要额外修改,配置完后端后刷新即可正常请求

内容的提问来源于stack exchange,提问作者Roby Sottini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:57:02