背景
CORS (Cross-Origin Resource Sharing) についてはこちらを参考
Access-Control-Allow-Origin
の仕様として、全てを受け入れる *
か、全てを受け入れない null
か、さもなければ個別で指定(複数の場合はスペース区切り)するしかできない。
「サブドメインを許可する」といったことをするには apache の mod_rewrite
を使うなどの工夫が必要。
- 仕様
- 工夫の例
barryvdh/laravel-cors はその辺りの面倒をよしなにやってくれる。
作者は laravel-debugbar や laravel-ide-helper などで(個人的に)おなじみの barryvdh さん。
検証
例として、Chrome の拡張機能 Advanced REST client を使ってプリフライトリクエストを発行してみる。
環境
- クライアント
- Google Chrome 67.0.3396.99(Official Build) (64 ビット)
- Advanced REST client 10.0.12-stable
- サーバ
- PHP 7.1.18
- Laravel 5.6.26
- barryvdh/laravel-cors 0.11.0
設定
検証内容に合わせて Chrome 拡張機能からのリクエスト(Origin
が chrome-extension://~
)を許可する設定。
※あくまで検証用。本番環境の設定は慎重に行うこと!
<?php
return [
/*
|--------------------------------------------------------------------------
| Laravel CORS
|--------------------------------------------------------------------------
|
| allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
| to accept any value.
|
*/
'supportsCredentials' => false,
'allowedOrigins' => [],
'allowedOriginsPatterns' => ['@^chrome-extension://.*@'],
'allowedHeaders' => ['*'],
'allowedMethods' => ['*'],
'exposedHeaders' => [],
'maxAge' => 0,
];
検証内容
サーバ側は /echo
という GET
と POST
を許可しているエンドポイントがある、という想定。
OPTIONS
メソッドと Access-Control-Request-Method
でプリフライトリクエスト扱いとなる。
OPTIONS https://<ドメイン>/echo
Access-Control-Request-Method: POST
結果
200 OK
が返って来ている。
(許可されてないリクエストだった場合 403 Forbidden
が返って来る)
また、レスポンスヘッダの Access-Control-Allow-Origin
には Advanced REST client を表す chrome-extension://apcedakaoficjlofohhcmkkljehnmebp
が自動的にセットされているのが確認できる。
Access-Control-Allow-Origin: chrome-extension://apcedakaoficjlofohhcmkkljehnmebp
参考
- laravel-cors のインストール手順などはこちらを参照