Mengimplementasikan https://github.com/fruitcake/php-cors untuk Laravel
Sejak Laravel 9.2, Middleware ini disertakan dalam laravel/framework. Anda dapat menggunakan middleware yang disediakan, yang harus kompatibel dengan Middleware dan konfigurasi yang disediakan dalam paket ini. Lihat https://github.com/laravel/laravel/pull/5825/files untuk mengetahui perubahannya.
Langkah-langkah untuk meningkatkan:
Hapus "fruitcake/laravel-cors"
dari composer.json Anda
Ganti FruitcakeCorsHandleCors::class,
dengan IlluminateHttpMiddlewareHandleCors::class,
di app/Http/Kernel.php
Lihat https://github.com/fruitcake/php-cors
untuk penggunaan lanjutan. Konfigurasinya tetap sama.
Paket laravel-cors
memungkinkan Anda mengirim header Cross-Origin Resource Sharing dengan konfigurasi middleware Laravel.
Jika Anda ingin mendapatkan gambaran umum global tentang alur kerja CORS, Anda dapat menelusuri gambar ini.
Saat memutakhirkan dari versi 0.x, ada beberapa perubahan yang dapat menyebabkan gangguan:
Properti 'jalur' baru digunakan untuk mengaktifkan/menonaktifkan CORS pada rute tertentu. Ini secara default kosong, jadi isi dengan benar!
Middleware grup tidak lagi didukung, gunakan middleware global
Nama vendor telah berubah (lihat instalasi/penggunaan)
Casing pada props di cors.php
telah berubah dari camelCase menjadi serpent_case, jadi jika Anda sudah memiliki file cors.php
Anda perlu memperbarui props di sana agar sesuai dengan casing baru.
Menangani permintaan OPTIONS pra-penerbangan CORS
Menambahkan header CORS ke respons Anda
Cocokkan rute untuk hanya menambahkan CORS ke Permintaan tertentu
Memerlukan paket fruitcake/laravel-cors
di composer.json
Anda dan perbarui dependensi Anda:
komposer membutuhkan kue buah/laravel-cors
Jika Anda mengalami konflik, ini mungkin karena barryvdh/laravel-cors atau Fruitcake/laravel-cors versi lama sudah diinstal. Hapus paket konflik terlebih dahulu, lalu coba instal lagi:
komposer menghapus kue buah barryvdh/laravel-cors/laravel-cors komposer membutuhkan kue buah/laravel-cors
Untuk mengizinkan CORS pada semua rute Anda, tambahkan middleware HandleCors
di bagian atas properti $middleware
kelas app/Http/Kernel.php
:
dilindungi $middleware = [ FruitcakeCorsHandleCors::kelas,// ...];
Sekarang perbarui konfigurasi untuk menentukan jalur tempat Anda ingin menjalankan layanan CORS, (lihat Konfigurasi di bawah):
'jalur' => ['api/*'],
Standarnya diatur di config/cors.php
. Publikasikan konfigurasi untuk menyalin file ke konfigurasi Anda sendiri:
vendor tukang php:publish --tag="cors"
Catatan: Saat menggunakan header khusus, seperti
X-Auth-Token
atauX-Requested-With
, Anda harus menyetelallowed_headers
untuk menyertakan header tersebut. Anda juga dapat mengaturnya ke['*']
untuk mengizinkan semua header khusus.
Catatan: Jika Anda secara eksplisit memasukkan header ke dalam daftar putih, Anda harus menyertakan
Origin
atau permintaan akan gagal dikenali sebagai CORS.
Pilihan | Keterangan | Nilai bawaan |
---|---|---|
jalur | Anda dapat mengaktifkan CORS untuk 1 atau beberapa jalur, misalnya. ['api/*'] | [] |
diperbolehkan_metode | Cocok dengan metode permintaan. | ['*'] |
diizinkan_asal | Cocok dengan asal permintaan. Wildcard dapat digunakan, misalnya. *.mydomain.com atau mydomain.com:* | ['*'] |
diperbolehkan_origins_patterns | Cocokkan asal permintaan dengan preg_match . | [] |
diperbolehkan_header | Menyetel header respons Access-Control-Allow-Headers. | ['*'] |
mengekspos_header | Menyetel header respons Access-Control-Expose-Headers. | [] |
usia_maks | Menyetel header respons Access-Control-Max-Age. | 0 |
mendukung_kredensial | Menyetel header Access-Control-Allow-Credentials. | false |
allowed_origins
, allowed_headers
dan allowed_methods
dapat diatur ke ['*']
untuk menerima nilai apa pun.
Catatan: Untuk
allowed_origins
Anda harus menyertakan skema saat tidak menggunakan wildcard, misalnya.['http://example.com', 'https://example.com']
. Anda juga harus memperhitungkan bahwa skema tersebut akan ada saatallowed_origins_patterns
.
Catatan: Cobalah untuk sespesifik mungkin. Anda dapat mulai mengembangkan dengan batasan yang longgar, tetapi lebih baik seketat mungkin!
Catatan: Karena metode http di-override di Laravel, mengizinkan metode POST juga akan memungkinkan pengguna API untuk melakukan permintaan PUT dan DELETE juga.
Catatan: Terkadang perlu menentukan port (misalnya saat Anda mengkode aplikasi di lingkungan lokal) . Anda dapat menentukan port atau menggunakan wildcard di sini juga, misalnya.
localhost:3000
,localhost:*
atau bahkan menggunakan FQDNapp.mydomain.com:8080
Di Lumen, cukup daftarkan ServiceProvider secara manual di file bootstrap/app.php
Anda:
$app->register(FruitcakeCorsCorsServiceProvider::class);
Salin juga file konfigurasi cors.php ke config/cors.php
dan terapkan:
$app->configure('cors');
Untuk mengizinkan CORS untuk semua rute Anda, tambahkan middleware HandleCors
ke middleware global dan atur properti paths
di konfigurasi.
$app->middleware([// ...FruitcakeCorsHandleCors::class, ]);
Pastikan pilihan path
pada konfigurasi sudah benar dan benar-benar sesuai dengan rute yang Anda gunakan. Ingatlah untuk menghapus cache konfigurasi juga.
Terkadang kesalahan/middleware yang mengembalikan responsnya sendiri dapat mencegah CORS Middleware dijalankan. Coba ubah urutan Middleware dan pastikan itu adalah entri pertama di middleware global, bukan grup rute. Periksa juga log Anda untuk mengetahui kesalahan sebenarnya, karena tanpa CORS, kesalahan akan ditelan oleh browser, hanya menampilkan kesalahan CORS. Coba juga jalankan tanpa CORS untuk memastikannya benar-benar berfungsi.
Jika Permintaan Anda menyertakan header Otorisasi atau menggunakan mode Kredensial, setel nilai supports_credentials
di konfigurasi ke true. Ini akan mengatur Header Access-Control-Allow-Credentials menjadi true
.
Jika Anda menggunakan echo()
, dd()
, die()
, exit()
, dump()
dll dalam kode Anda, Anda akan memutus aliran Middleware. Ketika output dikirim sebelum header, CORS tidak dapat ditambahkan. Ketika skrip keluar sebelum middleware CORS selesai, header CORS tidak akan ditambahkan. Selalu kembalikan respons yang tepat atau berikan Pengecualian.
Jika memungkinkan, gunakan grup rute dengan perlindungan CSRF yang dinonaktifkan. Jika tidak, Anda dapat menonaktifkan CSRF untuk permintaan tertentu di AppHttpMiddlewareVerifyCsrfToken
:
dilindungi $kecuali = ['api/*','sub.domain.zone' => [ 'awalan/*'], ];
CORS Middleware harus menjadi satu-satunya tempat Anda menambahkan header ini. Jika Anda juga menambahkan header di .htaccess, nginx atau file index.php Anda, Anda akan mendapatkan duplikat header dan hasil yang tidak diharapkan.
Jika Anda tidak melakukan permintaan Lintas Situs, artinya jika Anda tidak meminta site-a.com/api dari site-b.com, browser Anda tidak akan mengirimkan header permintaan Origin: https://site-b.com
, CORS akan "dinonaktifkan" karena header Access-Control-Allow-Origin
juga akan hilang. Hal ini terjadi karena permintaan dikirim dari tempat yang sama dan tidak diperlukan perlindungan dalam kasus ini.
Dirilis di bawah Lisensi MIT, lihat LISENSI.