Подтвердить что ты не робот

CORS с Laravel 4

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

И когда я пытаюсь сделать ajax-запросы через Backbone для своего api из своего веб-приложения (i.e 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 проверяет db и получает ключ 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 в '*' все, что мог найти в Интернете. Но пока ничего не получилось. Я не знаю, что я должен делать.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Нет смысла создавать объект причудливого ответа и возвращать его, а затем пропускать процесс страницы, поскольку он уничтожит ваши заголовки 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;
    }
});

Ответ 3

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

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

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

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