Skip to main content

Laravel: 開発時だけ他ホストからの要求を許可する (CORS)

背景

開発時のみフロントエンドを別ホスト・ポートで動作し、クロスサイトでのリクエストを許可したい。本番には適用しない。

実装

CORS ヘッダを設定するミドルウェアを作成する。

クロスサイトで認証情報つき(withCredentials)リクエストをおこないたい場合は Access-Control-Allow-Origin: * が許可されないため、リクエスト元のホスト名を入れて返している。 参考) Reason: Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class Cors
{
public function handle(Request $request, Closure $next): Response
{
/** @var Response $response */
$response = $next($request);

if (env('APP_DEBUG') && $request->header('Origin')) {
$response->headers->set('Access-Control-Allow-Credentials', 'true');
$response->headers->set('Access-Control-Allow-Origin', $request->header('Origin'));
$response->headers->set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
$response->headers->set('Access-Control-Allow-Headers', 'Origin, Authorization, Accept, Content-Type, X-XSRF-Token');
$response->headers->set('Access-Control-Expose-Headers', 'Authorization');
}

return $response;
}
}

このミドルウェアを有効にする。

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
...
protected $middleware = [
...
\App\Http\Middleware\Cors::class
];
...
}