включение корнов в codeigniter (restserver by @chriskacerguis)

Запрос http.get в контроллере agularJs отлично работает, когда мое клиентское приложение и api находятся в локальном хосте. когда api перемещается на сервер., возникает проблема.

клиентская сторона с использованием угловыхJs

$http.get('http://domain.com/api/spots/2/0').success(function(datas){ console.log(datas); }); 

log дает: запрос на перекрестный запрос заблокирован: политика одинакового происхождения запрещает чтение удаленного ресурса по адресу http://domain.com/api/spots/2/0 . Это можно устранить, переместив ресурс в тот же домен или включив CORS.

я добавил эти две строки к моей конструкции контроллера

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

все та же ошибка.

Попробуйте добавить OPTIONS к разрешенным методам.

 header("Access-Control-Allow-Methods: GET, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding"); 

и сразу же возвращаются, когда запрос является «ОПЦИИ» метода, когда вы устанавливаете заголовки.

 if ( "OPTIONS" === $_SERVER['REQUEST_METHOD'] ) { die(); } 

См. Также этот ответ .

Угловой отправляет запрос предварительной проверки W3C CORS, соответствующий проверке правильных разрешенных методов, прежде чем пытаться его выполнить.

Лично я считаю, что страницу CORS для разработчиков Mozilla Developer Network немного легче читать по этому вопросу, чтобы помочь понять поток CORS.

Если кто-то еще сталкивается с проблемой, включение CORS в файл rest.php Codeigniter REST Controller сработало для меня. Это также четко описано в комментариях здесь https://github.com/chriskacerguis/codeigniter-restserver/blob/master/application/config/rest.php

 //Change this to TRUE $config['check_cors'] = TRUE; //No change here $config['allowed_cors_headers'] = [ 'Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Access-Control-Request-Method' ]; //No change here $config['allowed_cors_methods'] = [ 'GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE' ]; //Set to TRUE to enable Cross-Origin Resource Sharing (CORS) from any source domain $config['allow_any_cors_domain'] = TRUE; //Used if $config['check_cors'] is set to TRUE and $config['allow_any_cors_domain'] is set to FALSE. //Set all the allowable domains within the array //eg $config['allowed_origins'] =['http://www.example.com','https://spa.example.com'] $config['allowed_cors_origins'] = []; 

если вы можете использовать jQuery Ajax, используйте эту строку в своем скрипте.

 jQuery.support.cors = true; // force cross-site scripting (as of jQuery 1.5) 

он решил проблему для меня, когда я попытался опубликовать некоторую строку, используя jQuery Ajax из гаджета рабочего стола в файл xppp php.

Сторона клиента => AngularJs (работает с Grunt в localhost: 9000) Сторона сервера => php (решение codeIgniter) (работает в localhost: 80)

Единственное, что сработало для меня, это добавить эти строки в контроллер веб-сервисов в моем проекте php:

  /* here you do whatever you do to build the $data */ //but just before returning the method data add this header('Content-type: application/json'); header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET"); header("Access-Control-Allow-Methods: GET, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Content-Length, Accept-Encoding"); echo json_encode($data, JSON_NUMERIC_CHECK); 

Я добавил следующий конструктор в свой класс контроллера

 public function __construct($config = 'rest') { header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); parent::__construct(); }