Yii2:如何在非 Restful API 上允许 CORS

2023-11-24

我正在 Yii2 Framework 上使用预构建的 API(不是 Restfull)。它使用 JSON 数据进行响应,并根据用户类型和凭证令牌接受请求。现在我必须制作一个位于不同位置(域)的应用程序,这会导致 CORS 冲突。

我的应用程序是 jQuery 并且我正在使用$.ajax用于数据发送和接收。 如何避免这种 CORS 冲突并通过 ajax 使用 API?

Regards

UPDATE:

正如 IStranger 在他的回答中告诉我的那样,我添加了以下代码:

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['corsFilter'] = [
        'class' => \yii\filters\Cors::className(),
        'cors' => [
            'Origin'                           => "*",
            'Access-Control-Request-Method'    => ['POST', 'GET'],
            'Access-Control-Allow-Credentials' => true,
            'Access-Control-Max-Age'           => 3600,
        ],
    ];
    return $behaviors;
}

但我仍然收到错误。有一个beforeAction在代码中这会是一个问题吗?

这是原始标题

Request:

Host: domain.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost/main/main.html
Content-Length: 296
Origin: http://localhost
Connection: keep-alive

回复:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Content-Length: 101
Content-Type: application/json; charset=UTF-8
Date: Thu, 22 Sep 2016 17:23:48 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=100
Pragma: no-cache
Server: Apache/2.4.17 (Win64) PHP/5.6.16
Set-Cookie: PHPSESSID=ph0b322gbq65m1f3m8fp9fphc0; path=/; HttpOnly
X-Powered-By: PHP/5.6.16

只需添加到您的 API 控制器:

/**
 * List of allowed domains.
 * Note: Restriction works only for AJAX (using CORS, is not secure).
 *
 * @return array List of domains, that can access to this API
 */
public static function allowedDomains()
{
    return [
        // '*',                        // star allows all domains
        'http://test1.example.com',
        'http://test2.example.com',
    ];
}

/**
 * @inheritdoc
 */
public function behaviors()
{
    return array_merge(parent::behaviors(), [

        // For cross-domain AJAX request
        'corsFilter'  => [
            'class' => \yii\filters\Cors::className(),
            'cors'  => [
                // restrict access to domains:
                'Origin'                           => static::allowedDomains(),
                'Access-Control-Request-Method'    => ['POST'],
                'Access-Control-Allow-Credentials' => true,
                'Access-Control-Max-Age'           => 3600,                 // Cache (seconds)
            ],
        ],

    ]);
}

此代码将添加到响应特殊的 http 标头。请求http header应该有Origin(跨域 AJAX 时浏览器会自动添加)。响应http标头应该有Access-Control-*标头。

NOTE:如果您在响应中没有看到这些 http 标头,可能意味着\yii\filters\Cors不工作。检查控制器中的其他行为/过滤器。尝试禁用此控制器的 CSRF 验证(它可能会阻止外部访问):

/**
 * Controller for API methods.
 */
class ApiController extends Controller
{

    /**
     * @var bool See details {@link \yii\web\Controller::$enableCsrfValidation}.
     */
    public $enableCsrfValidation = false;

    // ...
}

UPD:另外应该检查您的网络服务器。 nginx 可能需要额外的配置,apache 可能需要重新启动。

UPD2:更完整的说明在这里:https://stackoverflow.com/a/42435695/3793592

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii2:如何在非 Restful API 上允许 CORS 的相关文章

随机推荐

  • 如何使用 LLVM 传递中的现有函数传递?

    我一直在使用 LLVM 但我很困惑如何使用与我自己的通行证不同的已存在通行证 准确地说 我的程序需要针对任何给定指令进行优势前沿计算 LLVM 已经具有作为函数传递实现的 Dominance 函数类 我如何在我的模块通行证中调用它 使用它
  • 有没有一种简单安全的方法将 PrintWriter 转换为 PrintStream?

    有没有一种干净简单的方法来转换实例java io PrintWriter into a java io PrintStream 首先获得一个OutputStream来自Writer See 这个问题 然后将其作为参数传递给PrintStre
  • R:在朋友组中最佳地共享 Cookie

    我正在使用 R 编程语言 假设有 100 人 每个人都用 1 100 开始的 ID 表示 每个人都可以与其他人成为朋友 数据集可以用图形 网络格式表示 如下所示 Set the seed for reproducibility set se
  • Selenium 作为 Windows 服务运行以获取错误屏幕截图

    我想要一个基于 Selenium RC 的自动化 Web 测试套件 以便在遇到某些错误时截取页面的屏幕截图 该测试套件是持续集成过程的一部分 从技术上讲 由作为运行的 CruiseControl 执行Windows服务 The seleni
  • JavaScript 写入文本文件

    我正在尝试从表单中获取输入并将其保存到与 html 文件位于同一文件夹中的文本文件中 这是我到目前为止所拥有的
  • Spring 3:如何从 TaskExecutor 调用 @Async 注解的方法

    我是 Spring 异步任务执行的新手 所以如果这听起来像一个愚蠢的问题 请原谅我 我读到 Async 注释是从 Spring 3 x 开始在方法级别引入的 该方法的调用将异步发生 我还读到我们可以在 spring 配置文件中配置 Thre
  • 如何使用 Perl 轻松批量重命名文件?

    我有很多文件正在尝试重命名 我尝试创建一个正则表达式来匹配它们 但即使如此 我仍然卡在文件的命名上 如下所示 文件名01 文件名 100 文件名02 文件名03 等等 我想在任何小于 100 的文件后面添加一个 0 零 如下所示 文件名00
  • JavaFX - 等待任务完成

    我有一个 JavaFX 应用程序 它实例化了几个Task对象 目前 我的实现 见下文 调用行为运行工厂 它在任务对象下执行计算 与此平行的是 下一个函数 被调用 有没有办法拥有下一个函数 等待 直到先前的任务完成 我明白线程 join 等待
  • 树莓派自动登录无需etc/inittab

    我想将我的 Raspberry Pi 设置为以特定用户自动登录 我用谷歌搜索了这个 我找到的解决方案是关于编辑 etc inittab 文件 我的问题是现在我没有该文件 它在我的 Raspbian 版本中似乎丢失了 还有其他方法可以做到这一
  • 相当于 X11 中的“无效矩形”/“WM_PAINT”

    我正在将一些代码从 Windows 移植到 XLib 在Windows代码中 我可以通过调用强制重绘InvalidateRect然后处理相应的WM PAINT信息 但是 我无法找到如何在 X11 XLib 中执行此操作 我看到有一个Expo
  • 使用 javascript 将内容添加到表格行 ()?

    我有一个表如下 table tr td col 1 td td col2 td tr tr td field td td Field 2 td tr tr td another field td td one more field td t
  • MySQL 从一张表更新到另一张表时条件不起作用?

    我尝试过一种似乎对其他人有效的解决方案 从表 b 更新表 a 其中 条件 我似乎无法让它工作 MySql 给了我一个语法错误 我有两个表 我需要将一个表中的一列更新为另一列的值 其中两个表中的 id 都匹配 UPDATE video dat
  • 找不到控制器方法 - laravel 4

    我在尝试运行任何控制器时收到此消息 Symfony Component HttpKernel Exception NotFoundHttpException 未找到控制器方法 我的路线文件中有此代码 Route controller Hom
  • 重新分配而不释放旧内存

    我想使用 realloc 来增加内存大小 同时保持指针不变 因为调用者使用它 realloc 并不总是这样做 有时它会返回一个不同的指针并释放旧的指针 我想 尝试 重新分配内存 如果不可能 则使用原始指针回退到不同的方法 但重新分配已经破坏
  • CodeIgniter + jQuery(ajax) + HTML5 Pushstate:如何使用真实的 URL 进行干净的导航?

    我目前正在尝试建立一个新网站 没什么特别的 漂亮又小 但我一开始就陷入困境 我的问题是干净的 URL 和页面导航 我想以 正确的方式 去做 我想要什么 我使用 CodeIgniter 来获取干净的 URL 例如 www example co
  • 在ios中重绘视图

    是否可以重绘整个视图 我需要它来完成我的语言设置 问题是语言只有在再次绘制视图后才会改变 就像您退出设置然后再次进入一样 语言也会更改 但是当你保存所有内容时 语言保持不变 那么 在发现语言更改后 我应该如何重新绘制我的视图 或者最好是整个
  • 滑动屏幕的某些部分

    I am trying to design one screen which contain some swipe part I have one screen with mapview listview and some text My
  • 使用 axios 获取本地 JSON 数据时遇到问题

    我正在尝试使用 axios 从本地 json 文件获取数据 在控制台下我什至无法得到回应 所以我想我应该在这里询问一下 js 文件 var loadData function loadData axios url filepath json
  • ASP.Net MVC 模型绑定 - 如何更改日期格式?

    我有这个应用程序 默认日期格式必须是dd MM yyyy 语言为巴西葡萄牙语 我已经将文化和 UI 文化设置为pt BR现在myDate ToShortDateString 返回我想要的日期 我可以毫无困难地展示它们 问题是 当用户在输入字
  • Yii2:如何在非 Restful API 上允许 CORS

    我正在 Yii2 Framework 上使用预构建的 API 不是 Restfull 它使用 JSON 数据进行响应 并根据用户类型和凭证令牌接受请求 现在我必须制作一个位于不同位置 域 的应用程序 这会导致 CORS 冲突 我的应用程序是