在 CakePHP 应用程序中启用 CORS

Posted

技术标签:

【中文标题】在 CakePHP 应用程序中启用 CORS【英文标题】:Enabling CORS in CakePHP app 【发布时间】:2013-02-03 10:07:20 【问题描述】:

我正在尝试为 Cakephp 中内置的 API 启用 CORS,以便通过 AppController 中的以下内容访问所有请求:

public function beforeFilter()

    header("Access-Control-Allow-Origin: *");

这是在错误的地方吗?由于请求仍被阻止。

更新:看起来这确实有效,但是因为我正在做类似的事情:

header('Content-Type: application/json');
echo json_encode(array('message'=>'Hello world!'));

在我的一些方法中,它的行为好像覆盖了头设置 AppController,因此它不会出现在 JSON 调用的响应中。 有什么想法吗?

更新 2:返回 JSON 如下所示,修复了问题:

$this->response->type('json');
$this->response->body(json_encode(array('message'=>'Hello world!')));

那么显然在 Cake 中使用 header() 会破坏之前的标题?

【问题讨论】:

【参考方案1】:

您可以使用蛋糕响应对象来做到这一点;

$this->response->header('Access-Control-Allow-Origin', '*');

关于响应对象的更多信息; http://book.cakephp.org/2.0/en/controllers/request-response.html#setting-headers

不过,beforeRender() 回调似乎是一个更合乎逻辑的位置。

另一种选择是在您的 apache vhost 中添加此标头,或者 htaccess 示例可以在 Html5Boilerplate 的 htaccess 文件中找到,这是一件非常有趣的事情(有据可查),因为它包含许多运行良好的优化也可以使用 cakephp;

https://github.com/h5bp/server-configs-apache/blob/master/dist/.htaccess

http://html5boilerplate.com/

【讨论】:

试过了,但我仍然得到错误。似乎标题没有覆盖它...... 如果您在 firebug 中跟踪请求/响应标头,响应是否包含访问控制标头?因为如果是这样,问题可能与这个header无关 响应头呢?那些应该包含访问控制标头 我没有收到任何信息,因为访问被阻止,响应为空。 同一面板应包含“请求”标题和“响应”标题。我现在不在电脑前,但这是截图webkit.org/blog/1091/more-web-inspector-updates【参考方案2】:

根据我在这里发现的:Sending correct JSON content type for CakePHP

CakePHP 中返回 JSON 的正确方式是这样的:

$this->response->type('json');
$this->response->body(json_encode(array('message'=>'Hello world!')));

这是因为标头可以被覆盖,因此 CORS 不起作用,除非您使用 Cake 中的响应对象以“正确”的方式进行操作。

【讨论】:

以上是关于在 CakePHP 应用程序中启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 REST API + CORS 请求和选项方法

在 Java Play 应用中启用 CORS 过滤器

无法使用应用实例方法在 NestJS 中启用 CORS

如何在 Rails 4 应用程序中启用 CORS

在 React 应用中启用 CORS

如何在 MEAN STACK Web 应用程序中启用 CORS?