Я работал над приложениями Angular (Client) и Laravel (API) в течение последних нескольких месяцев локально на моих машинах разработчиков без каких-либо проблем. Несколько дней назад я загрузил приложения (клиент и api) на сервер, и внезапно я начал получать ошибки CORS:
Access to XMLHttpRequest at 'https://api.domain.pt/api/login' from origin 'https://client.domain.pt' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
В начале разработки у меня также были эти ошибки, потому что я использовал разные локальные домены как для клиента, так и для api (client.localhost и api.localhost) и в конечном итоге решил проблемы, добавив промежуточное ПО CORS в мой Laravel API:
public function handle($request, Closure $next)
{
//apply cors only to api routes
if (Request::segment(1) == 'api') {
header("Access-Control-Allow-Origin: *");
$headers = [
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers' => 'X-Requested-With, X-Auth-Token, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding, X-Login-Origin',
'Access-Control-Allow-Credentials' => 'true'
];
if ($request->isMethod("OPTIONS")) {
// The client-side application can set only headers allowed in Access-Control-Allow-Headers
return Response::make('OK', 200, $headers);
}
$response = $next($request);
foreach ($headers as $key => $value) {
$response->header($key, $value);
}
} else {
$response = $next($request);
}
return $response;
}
Все маршруты используют промежуточное ПО CORS. Когда приложение пытается отправить сообщение в api входа (/ api / login), оно даже не входит в промежуточное ПО CORS.
Почему это работает локально, а не на сервере?
Как глобально, так и по маршрутам. Я был в отчаянии: - \





Мне удалось решить свою проблему. Поскольку мое настраиваемое промежуточное ПО CORS не вызывается, я добавил настраиваемые заголовки в свой файл web.config:
<configuration>
<system.webServer>
<!-- SOLVES CORS ISSUES -->
<httpProtocol>
<customHeaders>
<add name = "Access-Control-Allow-Origin" value = "*" />
<add name = "Access-Control-Allow-Headers" value = "X-Requested-With, X-Auth-Token, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding, X-Login-Origin" />
<add name = "Access-Control-Allow-Methods" value = "GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
<!-- /SOLVES CORS ISSUES -->
</system.webServer>
</configuration>
Это наиболее подходящее решение, но пока я им воспользуюсь. Если у кого-то есть другое решение, кроме принудительного использования настраиваемых заголовков, ответьте.
Обновлено:
Временное решение для Apache. Добавьте это в свой файл .htaccess:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers "X-Requested-With, X-Auth-Token, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding, X-Login-Origin, responseType"
Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Чтобы получить помощь, перейдите по следующей справочной и справочной ссылке:
You can check CORS Middleware for Laravel package or below link:
Как вы зарегистрировали это промежуточное ПО? маршрут мудрый или глобально?