@yanceyguan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Laravel プロジェクトにおける CORS(クロスオリジン)リクエストの問題

Cloud Run に Laravel プロジェクトをデプロイする際、CSS や JS などの静的ファイルの読み込みで CORS(クロスオリジン)エラーが発生していますてください。

発生している問題・エラー

image.png

自分で試したこと

ルートファイル web.php に CORS ヘッダーを手動で追加しました。

Route::get('/build/assets/{path}', function ($path) {
    $fullPath = public_path("build/assets/{$path}");

    if (!file_exists($fullPath)) {
        abort(404);
    }

    return Response::file($fullPath, [
        'Content-Type' => mime_content_type($fullPath),
        'Access-Control-Allow-Origin' => 'https://my-server-domin',
        'Access-Control-Allow-Methods' => 'GET, OPTIONS',
        'Access-Control-Allow-Headers' => 'Content-Type, Authorization',
    ]);
})->where('path', '.*');

さらに、OPTIONS プリフライトリクエストの処理も追加しました

Route::options('/build/assets/{file}', function () {
    return response('', 204)
        ->header('Access-Control-Allow-Origin', 'https://my-server-domin')
        ->header('Access-Control-Allow-Methods', 'GET, OPTIONS')
        ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
})->where('file', '.*');

Cloud Run の起動コマンドは以下のように設定しました

CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8080"]

※ Laravel のバージョンは 12.12 を使用しています。

それにもかかわらず、CORS の問題は解決されませんでした:frowning2:。なぜでしょうか?
0 likes

1Answer

Fiddler などのキャプチャツールを使って要求・応答ヘッダを調べて、CORS に必要なものがちゃんと含まれているか調べてみてはいかがですか。うまくいくケースがあるなら、それとダメなケースを比較するとかでヒントが見つかるかもしれません。

ところで、なぜ「CSS や JS などの静的ファイル」なのですか? それらは普通 link タグや script タグを使って取得すると思いますが。どこか根本的にやり方が間違っているような気がします。


【追記】

参考に CORS に対応できてない場合のエラーメッセージ、Fiddler で見た要求・応答ヘッダー、加えてきちんと CORS 対応できた場合のFiddler で見た要求・応答ヘッダーを書いた記事を以下に紹介しておきます。

繰り返しますが、なぜ「CSS や JS などの静的ファイル」で CORS 対応が必要なのですか?

CORS 対応が必要なのは、クロスドメインの Web API に fetch などを使って要求を出し、JSON 形式の応答を受け取るというようなケースが多いのですが、その場合は「CSS や JS などの静的ファイル」は関係ないです。

普通の Web ページでは「CSS や JS などの静的ファイル」は link タグや script タグを使って取得しますが、その場合 CORS 対応は必要ないです。

何か考え違いがあるような気がします。CORS 云々の議論を始める前にそのあたりをクリアにした方が良さそうです。

1Like

Your answer might help someone💌