如何在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
相关产品推荐
相关产品推荐

