2013-07-09 2 views
17

Я пишу API и использую Laravel 4 для достижения этого. Мой api находится в другом домене. позволяет предположить, что это: http://api-example.com/CORS с Laravel 4

И когда я пытаюсь делать запросы AJAX через Backbone к моему апи из моего веб-приложения (т.е. mydomain.com) с базовой аутентификации, иногда работает нормально, но иногда это не делает. Я пытаюсь понять, почему. Ниже приведены мой фильтр App::before и фильтр App::after.

App::before(function($request) 
{ 
    if($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { 
     $statusCode = 204; 

     $headers = [ 
      'Access-Control-Allow-Origin'  => 'http://mydomain.com', 
      'Allow'       => 'GET, POST, OPTIONS', 
      'Access-Control-Allow-Headers'  => 'Origin, Content-Type, Accept, Authorization, X-Requested-With', 
      'Access-Control-Allow-Credentials' => 'true' 
     ]; 

     return Response::make(null, $statusCode, $headers); 
    } 
}); 

А мой после фильтра:

App::after(function($request, $response) 
{ 
    $response->headers->set('Access-Control-Allow-Origin', 'http://mydomain.com'); 
    $response->headers->set('Allow', 'GET, POST, OPTIONS'); 
    $response->headers->set('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Requested-With'); 
    $response->headers->set('Access-Control-Allow-Credentials', 'true'); 
    return $response; 
}); 

Дело в том, когда я пытаюсь сделать пост запрос на /login с учетными данными, API проверяет БД и получает ключ API для пользователя. Это просто отлично работает. Но когда я пытаюсь сделать запрос POST для /users хрома просто дает мне следующее сообщение об ошибке:

XMLHttpRequest cannot load http://api-example.com/users. Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin. 

Я попробовал все, такие как установка Access-Control-Allow-Origin для '*' все, что я мог бы быть в состоянии найти в Интернете. Но пока ничего не получилось. Я не знаю, что я должен делать.

+1

Осмотр сети с помощью чего-то вроде Chrome Dev Tools показывает, что там есть или нет (заголовок)? –

+0

Любая операция, отличная от GET, сначала запрашивает опцию «предполетный» запрос - как вам кажется. Убедитесь, что ваш фильтр уже запущен, даже если маршрут не существует для его соответствия. Также вы пытаетесь выполнить запросы PUT или DELETE? Ваши заголовки этого не допускают. Наконец, источник «*» не может использоваться с авторизацией. На самом деле, последнее примечание: как выглядит ваш запрос Ajax? В jQuery есть параметр для отправки запросов с авторизацией. – fideloper

+0

Я не думаю, что установлены заголовки. Вместо '$ response-> headers-> set()' try 'header ('Allow: GET, POST, OPTIONS')' может работать –

ответ

0

Некоторые браузеры могут отрицать это, потому что скрипты XSS делают неприятные вещи таким образом.

Если вы загрузите файл JS из http://api-example.com/ может помочь, но есть и более устойчивые решения:

  • Вы можете использовать локон (или что-то подобное) или
  • Вы можете использовать прокси-сервер (Apache, Nginx и т.д.) для вашего запроса AJAX для загрузки ответа от другого хоста
  • или, если вы использованияКонтактная балансировки нагрузки или во внешнем интерфейсе кэширования вещи, вы можете создать правило ...

Это де зависит от вашей инфраструктуры и потребностей, но если производительность имеет значение, пропустите завиток.

+0

Прошу прощения, но я действительно новичок в вещах балансировки нагрузки, можете ли вы объяснить подробно, если все в порядке для вас? Потому что я использую Amazon ELB для балансировки нагрузки, и я не знаю смысла «создания правила». –

3

Нет смысла создавать объект причудливого ответа и возвращать его, а затем пропускать процесс страницы, поскольку он уничтожит ваши заголовки CORS и продолжит обычное содержимое.

App::before(function($request) 
{ 
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { 

     header('Access-Control-Allow-Origin', 'http://mydomain.com'); 
     header('Allow', 'GET, POST, OPTIONS'); 
     header('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Request-With'); 
     header('Access-Control-Allow-Credentials', 'true'); 

     exit; 
    } 
}); 
6

В заголовке есть ошибка.

header('Allow', 'GET, POST, OPTIONS'); // This is wrong. 

header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // This is right.    
+0

Это фактическая ошибка. Я делаю то же самое с правильным ОТВЕТОМ, и он отлично работает со мной. @ Умут-Сирин – Raftalks