На сайте с формой установлен vuejs, axios они лежат на домене:
https://домен1.ру, Laravel развернут на IIS с доменом:
https://домен2.ру, доступ к api осуществляется через Passport, все контроллеры созданы, через POSTMAN запросы уходят без всяких ошибок.
Но стоит мне отправить форму с
https://домен1.ру на
https://домен2.ру/api/createOrder то на сайте с формой падает ошибка "Access to XMLHttpRequest at '
https://домен2.ру/api/createOrder' from origin '
https://домен1.ру' 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."
Перерыл весь гугл и яндекс ничего того, что могло бы решить мою проблему не нашел. Надеюсь на вашу помощь.
Сервер возвращает нужные заголовки. На Laravel поставил посредник CORS.
В браузере в консоли-network при отправке формы две строки на этот API, одна с ошибкой CORS, вторая с заголовками и методом запроса OPTIONS и ответом 200.
Код submitForm:
formSubmit(e) {
var payload = {
id_service: this.servicesModel,
object_type: this.typeObjModel,
object_address: this.address,
object_area: this.areaStr,
branch_id: this.branchModel,
order_name: this.orderName,
order_phone: this.orderPhone,
order_email: this.orderMail,
comments: this.comments
};
e.preventDefault();
let currentObj = this;
axios.post('https://домен2.ру/api/createOrder',
payload,{
method: 'POST',
mode: 'no-cors',
headers: {
'Accept': 'application/json',
'WithCredentials': true,
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json',
'Authorization': ''
},
withCredentials: true,
credentials: 'same-origin',
})
.then(function (response) {
currentObj.output = response.data;
})
.catch(function (error) {
currentObj.output = error;
});
}
Ответ на POST в котором возникает ошибка CORS
Request URL: https://домен2.ру/api/createOrder/
Referrer Policy: no-referrer-when-downgrade
Provisional headers are shown
Accept: application/json, text/plain, */*
Access-Control-Allow-Headers: Origin, Accept, Content-Type, Authorization, Access-Control-Allow-Origin
Access-Control-Allow-Origin: *
Content-Type: application/json;charset=UTF-8
DNT: 1
Referer: https://домен1.ру/order.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 OPR/71.0.3770.234
Ответ на POST в котором метод меняется на OPTIONS
Request URL: https://домен2.ру/api/createOrder/
Request Method: OPTIONS
Status Code: 200
Remote Address: IP(домен2.ру):443
Referrer Policy: no-referrer-when-downgrade
access-control-allow-origin: *
allow: OPTIONS, TRACE, GET, HEAD, POST
content-length: 0
date: Mon, 19 Oct 2020 13:00:09 GMT
public: OPTIONS, TRACE, GET, HEAD, POST
server: Microsoft-IIS/10.0
status: 200
:authority: домен2.ру
:method: OPTIONS
:path: /api/createOrder/
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
access-control-request-headers: access-control-allow-headers,access-control-allow-origin,authorization,content-type
access-control-request-method: POST
origin: https://домен1.ру
referer: https://домен1.ру/order.html
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: <cross-site
user-agent: <Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 OPR/71.0.3770.234
Middleware CORS.php
<?php
namespace App\Http\Middleware;
class Cors
{
public function handle($request, \Closure $next)
{
$headers = [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET, POST, PUT, PATCH, DELETE, OPTIONS',
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Max-Age' => '86400',
'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With, X-Auth-Token, Origin'
];
if ($request->isMethod('OPTIONS'))
{
return response()->json('{"method":"OPTIONS"}', 200, $headers);
}
$response = $next($request);
foreach($headers as $key => $value)
{
$response->header($key, $value);
}
return $response;
}
}
Routes/api.php
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware('cors','auth:api')->group( function () {
Route::post('/createOrder/', 'API\OnlineOrderController@store');
});
В kernel.php посредник добавлен, и по ответам postman все работает