Laravel 5.2 CORS, GET не работает с предполетными вариантами

Страшная ошибка CORS:

Запрос на перекрестный запрос заблокирован: политика одинакового происхождения запрещает чтение удаленного ресурса по адресу http: // localhost / mysite / api / test . (Причина: заголовок CORS «Access-Control-Allow-Origin» отсутствует).

Маршрут Laravel:

$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:

  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, но до сих пор не радуюсь. Любая помощь ценится!

Related of "Laravel 5.2 CORS, GET не работает с предполетными вариантами"

Совершенно не идеальное решение, но оно РАБОТАЕТ. Я добавил это в начало моего файла route.php:

 header('Access-Control-Allow-Origin: *'); header( 'Access-Control-Allow-Headers: Authorization, Content-Type' ); 

Было бы неплохо заставить это работать без взлома … увы.

ОБНОВЛЕНИЕ: Оказалось, что это связано с ИИС. Я закончил настройку заголовков в файле web.config, и теперь CORS работает без взлома файла route.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

 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 завершится с ошибкой. Счастливое кодирование.