コンテンツにスキップ

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