Piszę API i używam Laravel 4, aby to osiągnąć. Moje API znajduje się w innej domenie. Załóżmy, że jest: http://api-example.com/
CORS z Laravel 4
A gdy próbuję wykonać żądania ajax przez Backbone do mojego api z mojej aplikacji internetowej (tj. mydomain.com
) z podstawowym uwierzytelnieniem, czasami działa dobrze, ale czasami tak nie jest. Próbuję zrozumieć dlaczego. Poniżej znajduje się mój filtr App::before
i filtr 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);
}
});
i My po filtrze:
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;
});
Chodzi o to, kiedy próbuję zrobić żądania POST do /login
z poświadczeniami, API sprawdza db i dostaje klucz API dla użytkownika. To działa dobrze. Ale gdy próbuję wykonać żądanie POST do /users
chromem po prostu daje mi następujący błąd:
XMLHttpRequest cannot load http://api-example.com/users. Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.
Próbowałem wszystkiego, takie jak ustawienie Access-Control-Allow-Origin
do '*'
wszystko mogę być w stanie znaleźć z internecie. Ale nic nie zadziałało tak daleko. Nie wiem, co powinienem zrobić.
Sprawdzanie sieci za pomocą narzędzi Chrome Dev Tools pokazuje, że jest tam (czy nie)? –
Dowolna operacja, która nie jest dostępna, najpierw wykonuje żądanie "przed lotem" OPCJONALNOŚCI - jak to wygląda na pewno. Upewnij się, że twój filtr przed uruchomieniem działa, nawet jeśli nie ma trasy, która by pasowała. Czy próbujesz też użyć polecenia PUT lub DELETE? Twoje nagłówki nie pozwalają na to. Wreszcie, pochodzenie "*" nie może być używane z autoryzacją. Właściwie, ostatnia uwaga: jak wygląda twoje żądanie Ajax? jQuery ma ustawienie wysyłania żądań z autoryzacją. – fideloper
Nie sądzę, że nagłówki są ustawione. Zamiast '$ response-> headers-> set()' try 'header ('Zezwalaj: GET, POST, OPCJE')' może działać –