Laravel8でCORSが失敗するくだらない理由

最終更新日

ドメインをまたぐAPIをajaxで使おうとしたとき、

CORS Errorが起こる場合がよくあるようです。

たいがいはサーバー側のレスポンスヘッダーにAccess-Control-Allow-Origin を追記すればいいわけですが、

Laravel8からは

fruitcake/laravel-cors

というパッケージが最初から同梱されているのでこれを使います。

設定自体はとても簡単。ひとまずconfig/cors.phpを以下のように変えれば全てのリクエストで

Access-Control-Allow-Origin

が設定される。

    'paths' => ['*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,

/

/app/Http/Kernel.phpを見ると

protected $middleware = [
       \Fruitcake\Cors\HandleCors::class,

ここでこんな感じでHandleCorsを使うよう書いてあります。

で、普通はこれだけで万事解決なのですが、

なぜかレスポンスヘッダーにAccess-Control-Allow-Originが入ってこないケース

1.ミドルウェアの順番的におかしなことになってるケース

さきほどのkernel.phpの$middlewareはどうやら記載されたclassの順番が

実行される順番のようで、HandleCorsの処理が行われる前になにか問題があった時

Access-Control-Allow-Originが追記されない場合があるようです。

 \Fruitcake\Cors\HandleCors::class,

この記述を一番上に移動してみましょう。

2.ControllerでResponseをreturnしてないケース

普通はありえないんだけど、こんなケース

class Foo extends Controller{
  public function hoge(Request $request){
    echo "Hello world";
    return;
  }
}

もしくは、dd()、ddd()していると、Responseがreturnされないので、CORSエラーになります。

意外とこういうちょっとドジな問題ってハマりますよね。

masa