therefore origin not has enable configurar been barryd allowed php laravel cors vue.js laravel-5.2

php - origin - Laravel 5.2 CORS, GET no funciona con OPCIONES de verificación previa



laravel 5.5 enable cors (6)

El temido error de CORS:

Solicitud de origen cruzado bloqueada: la misma política de origen no permite leer el recurso remoto en http://localhost/mysite/api/test . (Motivo: Falta el encabezado CORS ''Access-Control-Allow-Origin'').

Ruta de 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 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 relevante:

RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Vue.js relevante:

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 } ) } } });

Si saco la opción de encabezado de autorización, la solicitud funciona.

También he intentado https://github.com/barryvdh/laravel-cors pero todavía no hay alegría. Cualquier ayuda apreciada!


Claramente no es la solución ideal pero FUNCIONA. He añadido esto a la parte superior de mi archivo route.php:

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

Sería bueno hacer que esto funcione sin un truco ... por desgracia.

ACTUALIZACIÓN: Resultó estar relacionado con IIS. Terminé configurando los encabezados en el archivo web.config y ahora CORS funciona sin piratear el archivo 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>

Si desea restringir el acceso, puede agregar reglas de salida:

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


El problema surge de la solicitud de verificación previa, de hecho, pero la forma de manejar requiere una explicación adicional, cuando hablamos de Laravel, principalmente la solicitud de OPTIONS se enruta (algo que las otras respuestas prefieren hacer a la manera de PHP, que a la manera de Laravel) Tienes que agregar esto a tus rutas para que tenga éxito:

Route::options(''/{any}'', function(){ return ''''; })->where(''any'', ''.*'');

Ahora, vamos a atender todos los demás métodos: crear middleware 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''); } }

Y finalmente, para una ruta dada, use ese middleware:

Route::put(''/test'', function(){ echo(''test''); })->with(''cors'');


Esta respuesta se basa en este article . https://github.com/barryvdh/laravel-cors middleware library, se puede usar para solucionar el problema (Intercambio de recursos entre orígenes).

paso 1 instálalo:

composer require barryvdh/laravel-cors

paso 2 Liberación de archivos de proveedores de la biblioteca:

php artisan vendor:publish --provider="Barryvdh/Cors/ServiceProvider"

paso 3 El comando ejecutado en el paso 2 copiará un archivo cors.php en el directorio de configuración, que se ve así:

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, ];

Para allowedOrigins el valor puede ser [''*''] que indica que el origen de la solicitud puede ser de cualquier dominio, o una matriz de dominios específicos que pueden ser los orígenes a los que permitiremos enviar solicitudes a nuestra api , como esto [''first.com'', ''second.com'', ''register.third.com'']

y también allowedMethods puede ser [''*''] o una lista de HTTP verbs permitidos, por ejemplo, [''POST'', ''GET'']

paso 4 Registro del middleware cors. Abra la app/Http/kernel.php y agregue la clase HandleCors a $routeMiddleware esta manera:

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 ];

paso 5 Ahora puedes agregar el middleware laravel-cors a cualquier ruta que desees. Por ejemplo en Routes/api.php haré esto:

Route::apiResource(''category'', ''CategoryController'')->middleware(''cors''); Route::apiResource(''product'', ''ProductController'')->middleware(''cors'');


Puede omitir este sin usar ningún middleware como Barryvdh / Cors para Laravel que no funcionaba correctamente con JWT AUTH. He agregado las siguientes declaraciones en el index.php en Laravel justo antes de la creación de instancias de Kernel.

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'');

agrega este antes

$kernel = $app->make(Illuminate/Contracts/Http/Kernel::class);

Esto debería funcionar correctamente con JWT AUTH también. Tenga en cuenta que, en Access-Control-Allow-Headers, debe incluir la Autorización, de lo contrario no se permitirá su acceso con el encabezado de autorización, por lo que JWT AUTH fallará. Feliz codificacion


Resuelvo mi problema simplemente agregando esta línea en mi route.php Laravel 5.2 Para mayor que 5.2 en route / 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'');

O registre el middleware Cors en la pila de middleware HTTP global

protected $middleware = [ /Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode::class, /App/Http/Middleware/CorsMiddleware::class ];


Su middleware está bien, pero necesita registrar el middleware de Cors en la pila de middleware HTTP global.

protected $middleware = [ /Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode::class, /App/Http/Middleware/CorsMiddleware::class ];