Laravel 用に https://github.com/fruitcake/php-cors を実装します。
Laravel 9.2以降、このミドルウェアはlaravel/frameworkに含まれています。提供されたミドルウェアを使用できます。これは、このパッケージで提供されるミドルウェアおよび構成と互換性がある必要があります。変更点については、https://github.com/laravel/laravel/pull/5825/files を参照してください。
アップグレードの手順:
あなたのcomposer.jsonから"fruitcake/laravel-cors"
削除してください
app/Http/Kernel.php
のFruitcakeCorsHandleCors::class,
IlluminateHttpMiddlewareHandleCors::class,
に置き換えます。
高度な使用方法については、 https://github.com/fruitcake/php-cors
参照してください。構成は同じままです。
laravel-cors
パッケージを使用すると、Laravel ミドルウェア構成で Cross-Origin Resource Sharing ヘッダーを送信できます。
CORS ワークフローの全体的な概要を知りたい場合は、この画像を参照してください。
0.x バージョンからアップグレードする場合、いくつかの重大な変更があります。
新しい「パス」プロパティは、特定のルートで CORS を有効または無効にするために使用されます。デフォルトでは空になっているので、正しく入力してください。
グループ ミドルウェアはサポートされなくなりました。グローバル ミドルウェアを使用してください
ベンダー名が変更されました (インストール/使用法を参照)
cors.php
内のプロップの大文字と小文字が CamelCase から Snake_case に変更されたため、すでにcors.php
ファイルがある場合は、新しい大文字と一致するようにそこにあるプロップを更新する必要があります。
CORS プリフライト OPTIONS リクエストを処理します
応答に CORS ヘッダーを追加します
ルートを照合して特定のリクエストにのみ CORS を追加する
あなたのcomposer.json
にfruitcake/laravel-cors
パッケージを要求し、依存関係を更新します。
作曲家にはフルーツケーキ/laravel-corsが必要です
競合が発生した場合は、古いバージョンの barryvdh/laravel-cors または Fruitcake/laravel-cors がインストールされていることが原因である可能性があります。まず競合するパッケージを削除してから、再度インストールしてみてください。
作曲家は barryvdh/laravel-cors フルーツケーキ/laravel-cors を削除します 作曲家にはフルーツケーキ/laravel-corsが必要です
すべてのルートで CORS を許可するには、 app/Http/Kernel.php
クラスの$middleware
プロパティの先頭にHandleCors
ミドルウェアを追加します。
protected $middleware = [ FruitcakeCorsHandleCors::class,// ...];
次に、構成を更新して、CORS サービスを実行するパスを定義します (以下の構成を参照)。
'パス' => ['api/*'],
デフォルトはconfig/cors.php
で設定されます。構成を公開して、ファイルを独自の構成にコピーします。
php 職人ベンダー:publish --tag="cors"
注:
X-Auth-Token
やX-Requested-With
などのカスタム ヘッダーを使用する場合は、これらのヘッダーを含めるようにallowed_headers
を設定する必要があります。['*']
に設定して、すべてのカスタム ヘッダーを許可することもできます。
注:ヘッダーを明示的にホワイトリストに登録している場合は、
Origin
含める必要があります。そうしないと、リクエストは CORS として認識されません。
オプション | 説明 | デフォルト値 |
---|---|---|
パス | 1 つまたは複数のパスに対して CORS を有効にできます。 ['api/*'] | [] |
許可されたメソッド | リクエストメソッドと一致します。 | ['*'] |
allowed_origins | リクエストの送信元と一致します。ワイルドカードを使用できます。 *.mydomain.com またはmydomain.com:* | ['*'] |
allowed_origins_patterns | リクエストの発信元をpreg_match と照合します。 | [] |
allowed_headers | Access-Control-Allow-Headers 応答ヘッダーを設定します。 | ['*'] |
公開ヘッダー | Access-Control-Expose-Headers 応答ヘッダーを設定します。 | [] |
max_age | Access-Control-Max-Age 応答ヘッダーを設定します。 | 0 |
サポート資格情報 | Access-Control-Allow-Credentials ヘッダーを設定します。 | false |
allowed_origins
、 allowed_headers
、およびallowed_methods
['*']
に設定して、任意の値を受け入れることができます。
注:
allowed_origins
の場合、ワイルドカードを使用しない場合はスキームを含める必要があります。['http://example.com', 'https://example.com']
。allowed_origins_patterns
を使用する場合は、スキームが存在することも考慮する必要があります。
注:できるだけ具体的にするようにしてください。緩い制約で開発を開始することもできますが、できるだけ厳しい制約を課すことをお勧めします。
注: Laravel では http メソッドがオーバーライドされているため、POST メソッドを許可すると、API ユーザーも PUT および DELETE リクエストを実行できるようになります。
注:場合によっては、ポートの指定が必要になることがあります(ローカル環境でアプリをコーディングしている場合など) 。ここでもポートを指定することも、ワイルドカードを使用することもできます。
localhost:3000
、localhost:*
、または FQDN を使用してもapp.mydomain.com:8080
Lumen では、 bootstrap/app.php
ファイルに ServiceProvider を手動で登録するだけです。
$app->register(FruitcakeCorsCorsServiceProvider::class);
また、cors.php 構成ファイルをconfig/cors.php
にコピーし、実行します。
$app->configure('cors');
すべてのルートで CORS を許可するには、 HandleCors
ミドルウェアをグローバル ミドルウェアに追加し、構成でpaths
プロパティを設定します。
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
構成内のpath
オプションが正しく、使用しているルートと実際に一致していることを確認してください。設定キャッシュも忘れずにクリアしてください。
独自の応答を返すエラー/ミドルウェアにより、CORS ミドルウェアの実行が妨げられる場合があります。ミドルウェアの順序を変更して、それがルート グループではなく、グローバル ミドルウェアの最初のエントリであることを確認してください。また、実際のエラーがないかログを確認してください。CORS がないと、エラーはブラウザに飲み込まれ、CORS エラーのみが表示されるためです。また、CORS なしで実行して、実際に動作することを確認してください。
リクエストに Authorization ヘッダーが含まれている場合、または Credentials モードを使用している場合は、構成内のsupports_credentials
値を true に設定します。これにより、 Access-Control-Allow-Credentials ヘッダーがtrue
に設定されます。
コード内でecho()
、 dd()
、 die()
、 exit()
、 dump()
などを使用すると、ミドルウェア フローが中断されます。出力がヘッダーの前に送信される場合、CORS を追加することはできません。 CORS ミドルウェアが終了する前にスクリプトが終了すると、CORS ヘッダーは追加されません。常に適切な応答を返すか、例外をスローします。
可能であれば、CSRF 保護が無効になっているルート グループを使用してください。それ以外の場合は、 AppHttpMiddlewareVerifyCsrfToken
で特定のリクエストに対して CSRF を無効にすることができます。
protected $excel = ['api/*','sub.domain.zone' => [ 'prefix/*'], ];
CORS ミドルウェアは、これらのヘッダーを追加する唯一の場所である必要があります。 .htaccess、nginx、またはindex.phpファイルにもヘッダーを追加すると、ヘッダーが重複して予期しない結果が得られます。
クロスサイト リクエストを実行していない場合、つまり site-b.com から site-a.com/api をリクエストしていない場合、ブラウザはOrigin: https://site-b.com
リクエスト ヘッダーを送信しません。 Access-Control-Allow-Origin
ヘッダーも欠落しているため、CORS は「無効」になります。これは、リクエストが同じところからディスパッチされており、この場合は保護が必要ないために発生します。
MIT ライセンスに基づいてリリースされています。「ライセンス」を参照してください。