在CakePHP应用程序中启用CORS

时间:2013-02-18 21:16:05

标签: php cakephp cors

我正在尝试为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()会破坏之前的标题?

2 个答案:

答案 0 :(得分:13)

您可以使用蛋糕响应对象执行此操作;

$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/

答案 1 :(得分:-1)

根据我在此处发现的内容:Sending correct JSON content type for CakePHP

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

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

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