Handle CORS Requests with VueJS Client & Laravel API

This issue might have occurred while developing an application which consists of API calls at each step. Here we're concerned with VueJS Client & Laravel API, to be specific.

The Problem

Method POST is not allowed by Access-Control-Allow-Methods in preflight response.

This issue might have occurred before you while developing an application which consists of API calls at each step. Here we’re concerned with VueJS Client & Laravel API, to be specific. Let’s discuss some of possible solutions to tackle this behaviour and fix it for once and forever.

The Solution? Solutions*

Solution # 01

This is the most simplest, dirtiest and yet quickest solution for this problem, simply add the following lines in your web/routes.php file to allow CORS for your application.

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

Solution # 02

This second solution may also be considered as dirty as per my taste. But works fine for quick results. Add the below code in the start of your public/index.php file & replace your API & Client URIs to allow CORS for your application.

$allowedOrigins = array(
   '(http(s)://)?(www\.)?your_api_domain\.com', // Laravel API Domain
   'http://my_vue_client.dev' // VueJS CLient
);
if (isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN'] != '') {
   foreach ($allowedOrigins as $allowedOrigin) {
      if (preg_match('#' . $allowedOrigin . '#', $_SERVER['HTTP_ORIGIN'])) {
         header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
         header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
         header('Access-Control-Max-Age: 1000');
         header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
         break;
      }
   }
}

Solution # 03

Create a CORS middleware and set everything there, likeso

php artisan make:middleware CorsMiddleware

Now inside of the handle method of CorsMiddleware

header("Access-Control-Allow-Origin: *");

$headers = [
 'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
 'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin'
];
if($request->getMethod() == "OPTIONS") {

 return response()->make('OK', 200, $headers);
}

$response = $next($request);
foreach($headers as $key => $value)
 $response->header($key, $value);
return $response;

Register the middleware in app\Http\Kernel.php

protected $routeMiddleware = [
   'cors' => \App\Http\Middleware\CorsMiddleware::class,
];

And use it in your routes,

Route::middleware('cors')->group(function(){
   //your_routes
});

Solution # 04

You can use any of the packages available for handling CORS specifically. Following is one of my favourite package for CORS, you my try this as well.

  • https://github.com/barryvdh/laravel-cors

Conclusion

You can use any of the above method to tackle CORS issue in your Laravel based application. If you have any other way out rather then these approaches, do let us know in the comment section below.

Note that, all of the above solutions are tried and tested and worked great. If you have any queries regarding this article, leave us a comment below. You can also follow us on Twitter.

Comments