2014-09-06 2 views
4

Запрос http.get в контроллере agularJs отлично работает, когда мое клиентское приложение и api находятся в локальном хосте. , когда api перемещается на сервер., Возникает проблема., позволяющий использовать корс в codeigniter (restserver by @chriskacerguis)

стороне клиента с помощью angularJs

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

журнал дает: Cross-Origin Request Заблокировано: The Same Origin Policy Запрещает чтение удаленного ресурса на http://domain.com/api/spots/2/0. Это можно устранить, переместив ресурс в тот же домен или включив CORS.

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

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

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

еще такую ​​же ошибку.

ответ

10

Попробуйте добавить 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(); 
} 

См. Также this answer.

Угловой посылает W3C CORS spec compliant preflight request, который будет проверять правильные допустимые методы перед тем, как это сделать.

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

+0

я добавил OPTIONS. до сих пор никаких изменений ... im использование [link] (https://github.com/chriskacerguis/codeigniter-restserver) для codeigniter .. все что с этим делать? и мне нужно внести какие-либо изменения в angularJS? – onerinas

+0

Ну, я бы сначала дважды проверил ваши инструменты для браузера dev и посмотрел на журнал сетевого трафика/консоли.Убедитесь, что вы получаете вызов, отправленный в конечную точку api [или нет], а затем ваш угловой код не бросает ошибки. – Ross

+0

Спасибо, похоже, что это должно быть прямо со стороны интерфейса. Одна вещь, чтобы попытаться умереть/выйти из PHP-скрипта после установки заголовков, прежде чем что-либо еще произойдет. Поэтому установите заголовки, а затем сразу же умрете, если метод запроса === «ОПЦИИ». Подробнее см. [Этот ответ] (http://stackoverflow.com/questions/15602099/http-options-error-in-phil-sturgeons-codeigniter-restserver-and-backbone-js?rq=1) (попробуйте добавить Разрешить заголовки часть из этого ответа тоже) – Ross

0

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

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

это решило проблему для меня, когда я попытался отправить некоторые строки, используя JQuery Ajax из боковой панели рабочего стола гаджет в файл XAMPP PHP.

+0

в моем угловом приложении или кодегниторе? – onerinas

+0

Он будет работать только в том случае, если вы используете библиотеку jQuery. После определения библиотеки поместите эту строку в файл сценария, который у вас есть или под скрипт-тегами внутри вашего html-файла. –

+0

после этого мне нужно вызвать api через jquery? , если это так наименее предпочтительным для этого метода, потому что чтение где-нибудь с использованием jquery и угловых методов может конфликтовать (если нет, пожалуйста, исправьте меня) – onerinas

0

стороне клиента => AngularJs (работает с Грантом в локальном хосте: 9000) стороне сервера => PHP (CodeIgniter решение) (работает в локальном хосте: 80)

Единственное, что работал для меня, чтобы добавить этот линии в контроллер WebServices в моем 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); 
1

Если кто-либо встает вопрос, что позволяет CORS в rest.php файле CodeIgniter REST контроллер работал для меня. Это также четко документированы в комментариях здесь 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 
//e.g. $config['allowed_origins'] =['http://www.example.com','https://spa.example.com'] 

$config['allowed_cors_origins'] = []; 
0

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

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