Я пытаюсь включить CORS для API, встроенного в CakePHP, чтобы все запросы были доступны с помощью следующего в 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!')));
Таким образом, очевидно, используя header()
в Cake разбивает предыдущие заголовки?
Вы можете сделать это, используя объект ответа на торт;
$this->response->header('Access-Control-Allow-Origin', '*');
Дополнительная информация об объекте ответа; http://book.cakephp.org/2.0/en/controllers/request-response.html#setting-headers
Однако обратный вызов beforeRender () кажется более логичным.
Другим вариантом является добавление этого заголовка в примеры apache vhost или htaccess, которые можно найти в файле htaccess Html5Boilerplate, что очень интересно посмотреть (хорошо документировано), поскольку оно содержит множество оптимизаций, которые хорошо работают с cakephp как Что ж;
https://github.com/h5bp/server-configs-apache/blob/master/dist/.htaccess
Основываясь на том, что я узнал здесь: Отправка правильного типа контента JSON для CakePHP
Правильный способ возврата JSON в CakePHP выглядит так:
$this->response->type('json'); $this->response->body(json_encode(array('message'=>'Hello world!')));
Это связано с тем, что заголовки могут быть переопределены, и поэтому CORS не работает, если вы не сделаете это «правильным» способом, используя объект ответа в Cake.