Я пишу 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
для '*'
все, что я мог бы быть в состоянии найти в Интернете. Но пока ничего не получилось. Я не знаю, что я должен делать.
Осмотр сети с помощью чего-то вроде Chrome Dev Tools показывает, что там есть или нет (заголовок)? –
Любая операция, отличная от GET, сначала запрашивает опцию «предполетный» запрос - как вам кажется. Убедитесь, что ваш фильтр уже запущен, даже если маршрут не существует для его соответствия. Также вы пытаетесь выполнить запросы PUT или DELETE? Ваши заголовки этого не допускают. Наконец, источник «*» не может использоваться с авторизацией. На самом деле, последнее примечание: как выглядит ваш запрос Ajax? В jQuery есть параметр для отправки запросов с авторизацией. – fideloper
Я не думаю, что установлены заголовки. Вместо '$ response-> headers-> set()' try 'header ('Allow: GET, POST, OPTIONS')' может работать –