Страшная ошибка CORS:
Запрещен перекрестный запрос: одна и та же политика происхождения запрещает чтение
удаленный ресурс на HTTP: // локальный / MySite / API / тест. (Причина: CORS
отсутствует заголовок «Access-Control-Allow-Origin».
Маршрут Ларавел:
$router->group(['prefix' => 'api', 'middleware' => 'cors'], function ($router) {
$router->get('/test', 'MyController@myMethod');
});
Laravel Cors Middlware:
public function handle($request, Closure $next)
{
header('Access-Control-Allow-Origin: *');
// ALLOW OPTIONS METHOD
$headers = [
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers' => 'Content-Type, X-Auth-Token, Origin, Authorization'
];
if ($request->getMethod() == "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);
return $response;
}
Laravel Kernel:
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'cors' => \App\Http\Middleware\CORS::class
];
Соответствующий .htaccess:
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Соответствующее Vue.js:
new Vue({
el: '#app',
data: {
//data here
},
http: {
headers: {
"Authorization": "Basic " + "apiKeyHere"}
},
methods: {
mymethod: function (e)
{
e.preventDefault();
this.$http.get('http://localhost/mysite/api/test').then(
function (response)
{
//do something
}
)
}
}
});
Если я уберу опцию Авторизация заголовка, запрос будет работать.
Я также пытался https://github.com/barryvdh/laravel-cors но до сих пор нет радости.
Любая помощь приветствуется!
Ясно, что это не идеальное решение, но оно РАБОТАЕТ. Я добавил это в начало моего файла rout.php:
header('Access-Control-Allow-Origin: *');
header( 'Access-Control-Allow-Headers: Authorization, Content-Type' );
Было бы неплохо заставить это работать без взлома … увы.
ОБНОВЛЕНИЕ: Оказалось, что это связано с IIS. В итоге я установил заголовки в файле web.config, и теперь CORS работает без взлома файла rout.php.
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Headers" value="Origin, Authorization, X-Requested-With, Content-Type, Accept" />
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
</customHeaders>
</httpProtocol>
Если вы хотите ограничить доступ, вы можете добавить исходящие правила:
<outboundRules>
<clear />
<rule name="AddCrossDomainHeader">
<match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="true">
<add input="{HTTP_ORIGIN}" pattern="(http(s)?://((.+\.)?somesite\.com|(.+\.)?anothersite\.org))" />
</conditions>
<action type="Rewrite" value="{C:0}" />
</rule>
</outboundRules>
Я решаю свою проблему, просто добавив эти строки в мои маршруты.php Laravel 5.2
Для больше чем 5.2 в маршрутах / web.php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, X-Auth-Token, Origin, Authorization');
ИЛИ зарегистрируйте промежуточное ПО Cors в глобальном стеке промежуточного ПО HTTP
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\CorsMiddleware::class
];
Ваше промежуточное ПО в порядке, но вам нужно зарегистрировать промежуточное ПО Cors в глобальном стеке промежуточного ПО HTTP.
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\CorsMiddleware::class
];
Проблема возникает из предварительного запроса, действительно, но способ обработки требует некоторого дополнительного объяснения, когда мы говорим о Laravel — главным образом OPTIONS
запрос направляется (что-то, что другие ответы скорее делают PHP, чем Laravel), поэтому вы должны добавить это в ваши маршруты, чтобы он был успешным:
Route::options('/{any}', function(){ return ''; })->where('any', '.*');
Теперь давайте разберемся со всеми остальными методами — создадим промежуточное программное обеспечение CORS:
namespace App\Http\Middleware;
use Closure;
class Cors
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request)
->header('Access-Control-Allow-Origin', '*')
->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE');
}
}
И, наконец, для данного маршрута используйте это промежуточное ПО:
Route::put('/test', function(){ echo('test'); })->with('cors');
Вы можете обойти это без использования промежуточного программного обеспечения, такого как Barryvdh \ Cors для Laravel, которое не работает должным образом с JWT AUTH. Я добавил следующие выражения в index.php в Laravel непосредственно перед созданием ядра
header('Access-Control-Allow-Origin: http://localhost:8001');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token,Authorization');
header('Access-Control-Allow-Credentials: true');
добавить это раньше
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
это должно работать должным образом и с JWT AUTH. Пожалуйста, обратите внимание, что в Access-Control-Allow-Headers вы должны включить авторизацию, иначе ваш accesstoken не будет разрешен с заголовком авторизации, поэтому JWT AUTH завершится с ошибкой. Удачного кодирования.
Этот ответ основан на этом статья.
barryvdh / Laravel-CORS библиотека промежуточного программного обеспечения, может использоваться для решения проблемы (Cross-Origin Resource Sharing).
шаг 1 Установите это:
composer require barryvdh/laravel-cors
шаг 2 Выпуск вендора файлов библиотеки:
php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"
шаг 3 Команда, запущенная на шаге 2, скопирует файл cors.php в каталог конфигурации, который выглядит следующим образом:
return [
/*
|--------------------------------------------------------------------------
| Laravel CORS
|--------------------------------------------------------------------------
|
| allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
| to accept any value.
|
*/
'supportsCredentials' => false,
'allowedOrigins' => ['*'],// ex: ['abc.com', 'api.abc.com']
'allowedHeaders' => ['*'],
'allowedMethods' => ['*'],// ex: ['GET', 'POST', 'PUT', 'DELETE']
'exposedHeaders' => [],
'maxAge' => 0,
];
За allowedOrigins
значение может быть ['*']
в котором указано, что источником запроса может быть любой домен или массив определенных доменов, которые могут быть источниками, которые мы позволим отправить запрос нашему api
, как это ['first.com', 'second.com', 'register.third.com']
а также allowedMethods
может быть ['*']
или список разрешенных HTTP verbs
например ['POST', 'GET']
шаг 4 Регистрация Cors Middleware. открыто app/Http/kernel.php
и добавить HandleCors
класс для $routeMiddleware
как это:
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'cors' => \Barryvdh\Cors\HandleCors::class, // add this line to enable cors to your routes
];
шаг 5 Теперь вы можете добавить laravel-cors
промежуточное программное обеспечение для любого маршрута, который вы хотите. Например, в Routes/api.php
Я сделаю это:
Route::apiResource('category', 'CategoryController')->middleware('cors');
Route::apiResource('product', 'ProductController')->middleware('cors');