APIなどのアプリケーションリソースに外部からのアクセスを受け入れるために CORS ヘッダーを設定する必要があるかもしれません。
Laravel で従来 CORS のヘッダーを設定するには barryvdh/laravel-cors
のパッケージが提供するミドルウェアを利用するのがデファクトスタンダードでしたが、このパッケージは2019年末にリリースされた1.0よりfruitcake/laravel-corsへと引っ越し、名前空間が変化しました。
また、2020年3月にリリースされた Laravel 7.0 よりこのパッケージは初期テンプレートにバンドルされ、初期状態で利用可能になりました。Laravel 6.xやそれ以前からの環境にて利用する場合や、それらからアップデートした環境にて利用する場合は従来通りパッケージのインストールが必要です。
パッケージのインストール
インストール手順はReadmeにあるとおり。
上記のとおり、Laravel 7.x で作成したプロジェクトであれば初期状態では既にインストールが完了しているはずです。
まずcomposerでパッケージの追加。
1 |
composer require fruitcake/laravel-cors |
ミドルウェアをapp/Http/Kernel.php
に追加する(ex: laravel/laravel)。ルート毎に追加してしまうと404などエラー時に CORS ヘッダーが出力されなくなるのでここに指定すること。 API 以外に CORS を設定したくない場合、後の設定ファイルにてパスを制限できるのでこれを使用するとよい。(Laravel 7.0の設定ファイルではデフォルトでapi/*
に制限されている)
1 2 3 4 5 |
protected $middleware = [ // ... \Fruitcake\Cors\HandleCors::class, // ... ]; |
必要に応じて設定ファイル(config/cors.php
)を publish する。なお、デフォルトでは全てのルートについてリクエストに応じたヘッダーが付与されるようになっている。 すべてのルートにおいて なにもしない 設定になっているので必須。
1 |
php artisan vendor:publish --tag="cors" |
設定項目
paths
はfruitcake/laravel-cors 固有の設定、allowed_origins
はワイルドカードが利用できるよう手が加えられている。それ以外はasm89/stack-corsの設定。ただし、キャメルケースへと変更されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
return [ /* * CORSヘッダーを出力するパスのパターン、任意でワイルドカード(*)が利用できる。 * 空だと一切のルートで機能しない。 * Example: ['api/*'] * 全てのルートを対象にする場合: ['*'] * APIと特定の画像を対象にする例: ['api/*', 'resources/example.png'] */ 'paths' => [], /* * マッチするHTTPメソッド。 `[*]` だと全てのリクエストにマッチする。 * GETとPOSTだけを許可する場合: ['GET', 'POST'] */ 'allowed_methods' => ['*'], /* * マッチするOrigin。`*`かオリジンに完全一致、またはワイルドカードが利用可。 * '*', allowed_origins(完全一致), allowed_origins_patterns, allowed_origins(ワイルドカード)の順に評価されることになる。 * `[*]`にすると全てのオリジンで許可。 * example.comとそのサブドメインを許可: ['https://example.com', 'https://*.example.com'] */ 'allowed_origins' => ['*'], /* * Matches the request origin with, similar to `Request::is()` * 正規表現によるオリジン指定。preg_matchの引数としてそのまま渡される。 * 例: ['#\Ahttps?://.+\.example\.com\z#'] */ 'allowed_origins_patterns' => [], /* * Sets the Access-Control-Allow-Headers response header. `[*]` allows all headers. */ 'allowed_headers' => ['*'], /* * Access-Control-Expose-Headers レスポンスヘッダーを指定する。 false or string[] */ 'exposed_headers' => false, /* * Access-Control-Max-Age レスポンスヘッダーを指定する。`false` or int * 600を指定すれば600秒このヘッダーがキャッシュされpreflightリクエストを減らせる。 */ 'max_age' => false, /* * Sets the Access-Control-Allow-Credentials header. bool (falsy値を指定すると出力せず、truthyな値を渡せばtrueが出力されるが) */ 'supports_credentials' => false, ]; |
とりあえずpathd
だけ指定しておけば最低限十分。
1.0.0以前(0.x)からのマイグレーション
いくつかの破壊的変更があるので修正が必要。
- 名前空間の変更
\Barryvdh\Cors
を\Fruitcake\Cors
に修正する必要がある (app/Http/Kernel.php
)
- グループミドルウェアがサポートされなくなった
- もし使用している場合、
Http/Kernel
に移動した上で必要に応じてpathsの使用を検討すること
- もし使用している場合、
config/cors.php
がsnakeCaseからcamel_caseへと変更されている。全てなおすこと。
“CORS を許可する” への1件の返信