Yii2.0.50跨域请求CORS配置【API安全】

星明吖_9662

星明吖_9662

2026-08-06

794人浏览

原创

yii 2.0.50需配置cors以支持跨域api调用:全局在config/web.php中通过response组件添加access-control-allow-origin等响应头,并在urlmanager中配置'options *'路由指向sitecontroller::actionoptions()处理预检请求;生产环境应限制origin并启用access-control-allow-credentials。

yii2.0.50跨域请求cors配置【api安全】

Yii 2.0.50项目对外提供API时,前端页面(如Vue或React单页应用)从不同域名发起AJAX请求,浏览器因同源策略拦截响应,控制台报错“CORS header ‘Access-Control-Allow-Origin’ missing”,必须在服务端显式配置CORS响应头才能放行。

全局启用CORS中间件

打开 config/web.php,在 components 数组内添加 response 组件配置:

→ 在 'components' => [ 下新增以下键值对:

'response' => [
  'class' => 'yii\web\Response',
  'on beforeSend' => function ($event) {
    $response = $event->sender;
    $response->headers->add('Access-Control-Allow-Origin', '*');
    $response->headers->add('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    $response->headers->add('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
    $response->headers->add('Access-Control-Expose-Headers', 'X-Pagination-Total-Count, X-Pagination-Page-Count, X-Pagination-Current-Page, X-Pagination-Per-Page');
  },
],

这一步直接注入响应头,覆盖所有控制器动作的输出。但注意:【OPTIONS预检请求不会触发action逻辑,仅靠此配置无法响应OPTIONS】——必须配合下一步路由拦截。

拦截并响应OPTIONS预检请求

Yii默认不处理OPTIONS方法,浏览器发出的预检请求会直接返回405或404。需在URL规则中显式捕获:

→ 打开 config/web.php → 找到 urlManager 配置块 → 在 'rules' => [ 内最顶部插入:

'' => 'site/index', // 兜底规则,不可删
'<strong>OPTIONS *</strong>' => 'site/options', // 关键:匹配任意路径的OPTIONS请求

→ 创建 controllers/SiteController.php,在类中添加:

public function actionOptions()
{
  return null; // 空响应体,仅返回204状态码和CORS头
}

这一步让所有OPTIONS请求落到 SiteController::actionOptions(),由框架自动附加CORS头并返回204。不写这一行,前端发POST前的OPTIONS会被拒绝,后续请求根本发不出去。

按模块/控制器精细化控制CORS

若生产环境要求限制允许来源(如只允许 https://admin.example.com),不能用 *,需动态判断 Origin:

方法一:修改 response 组件中的 on beforeSend 回调

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载

将原 $response->headers->add('Access-Control-Allow-Origin', '*'); 替换为:

$origin = Yii::$app->request->getHeaders()->get('Origin');
$allowedOrigins = ['https://admin.example.com', 'https://shop.example.com'];
if (in_array($origin, $allowedOrigins)) {
  $response->headers->add('Access-Control-Allow-Origin', $origin);
  $response->headers->add('Access-Control-Allow-Credentials', 'true'); // 若前端设 withCredentials=true,此行必加
}

方法二:使用行为(Behavior)在特定控制器中启用

→ 在控制器类(如 controllers/ApiController.php)顶部添加:

use yii\filters\Cors;
use yii\helpers\ArrayHelper;

→ 在 public function behaviors() 中返回:

return ArrayHelper::merge(parent::behaviors(), [
  'corsFilter' => [
    'class' => Cors::className(),
    'cors' => [
      'Origin' => ['https://admin.example.com'],
      'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
      'Access-Control-Request-Headers' => ['*'],
      'Access-Control-Allow-Credentials' => true,
    ],
  ],
]);

行为方式更安全,避免全局污染;但需确保该控制器继承自 yii\rest\Controller 或手动启用 ContentNegotiator,否则JSON响应可能出错。

验证CORS是否生效

第一步:启动服务,用 curl 检查响应头

curl -H "Origin: https://admin.example.com" -I http://localhost:8080/api/v1/users

第二步:观察返回中是否含 Access-Control-Allow-Origin: https://admin.example.com 和 Access-Control-Allow-Methods 等字段

第三步:在浏览器开发者工具 Network 标签页中,点开任意一个API请求 → 查看 Response Headers → 确认 CORS 头存在且值正确

第四步:若前端仍报错,检查是否漏配 Access-Control-Allow-Credentials ——只要前端 AJAX 设置了 withCredentials: true,后端就必须返回该头且值为 true,同时 Access-Control-Allow-Origin 不能为 *。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

2025.11.26

524

16

PHP Yii框架专题
PHP Yii框架专题

本专题专注于PHP主流框架Yii的应用,系统讲解MVC架构、路由机制、数据库操作、表单处理、安全验证与RESTful API 开发等核心内容。通过电商网站、后台管理系统与内容管理平台等实战项目,帮助学员快速掌握Yii框架的开发技巧与实战经验。

2025.09.04

2910

22

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

160

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习