Apakah ada cara untuk mengizinkan beberapa domain silang menggunakan Access-Control-Allow-Origin
header?
Saya sadar akan hal itu *
, tetapi terlalu terbuka. Saya benar-benar ingin mengizinkan hanya beberapa domain.
Sebagai contoh, sesuatu seperti ini:
Access-Control-Allow-Origin: http://domain1.example, http://domain2.example
Saya sudah mencoba kode di atas tetapi sepertinya tidak berfungsi di Firefox.
Apakah mungkin untuk menentukan beberapa domain atau saya terjebak hanya dengan satu domain?
.htaccess
http
cors
xmlhttprequest
cross-domain
Thomas J Bradley
sumber
sumber
Access-Control-Allow-Origin
header tidak berarti bahwa domain lain tidak dapat memicu metode pada titik akhir ini (mis. metode REST API). Ini hanya berarti bahwa asal yang dibolehkan tidak dapat menggunakan hasil dalam javascript (browser memastikan ini). Untuk membatasi akses ke titik akhir untuk domain tertentu gunakan filter permintaan sisi server yang misalnya mengembalikan HTTP 401 untuk domain yang tidak diizinkan.Vary: Origin
tajuk saat Anda ingin menggunakan beberapa URL, lihat: fetch.spec.whatwg.org/#cors-protocol-and-http-cachesJawaban:
Kedengarannya seperti cara yang disarankan untuk melakukannya adalah meminta server Anda membaca header Asal dari klien, membandingkannya dengan daftar domain yang ingin Anda izinkan, dan jika cocok, gema nilai
Origin
header kembali ke klien sebagai yangAccess-Control-Allow-Origin
header respon.Dengan
.htaccess
Anda dapat melakukannya seperti ini:sumber
Solusi lain yang saya gunakan di PHP:
sumber
header('Access-Control-Allow-Origin: *')
kadang - kadang mengatakan tidak dapat menggunakan kartu liar jika bendera kredensial benar - terjadi ketikaheader('Access-Control-Allow-Credentials: true')
mungkin. Jadi, lebih baik Izinkan-Asal$http_origin
itu sendiri jika persyaratannya terpenuhiheader("Access-Control-Allow-Origin: " . $http_origin);
untuk membuatnya berfungsiIni bekerja untuk saya:
Saat dimasukkan
.htaccess
, pasti akan berhasil.sumber
Header set Access-Control-Allow-Credentials true
ini agar berfungsi seperti jawaban @ GeorgeReferer
bukanOrigin
. MenggunakanReferer
karya tetapi masalahnya adalah mengatur URL lengkap kembali keAccess-Control-Allow-Origin
Saya ingin memotong nama domainReferer
dan menugaskannyaAccess-Control-Allow-Origin
. Sesuatu seperti hasil ini -echo http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
dalam perintah bash. Apakah ini mungkin untuk melakukan hal yang sama pada file conf (apache)? Ada ide?Saya memiliki masalah yang sama dengan font-woff, beberapa subdomain harus memiliki akses. Untuk mengizinkan subdomain saya menambahkan sesuatu seperti ini ke httpd.conf saya:
Untuk beberapa domain, Anda cukup mengubah regex di
SetEnvIf
.sumber
(.*\.?example\.org)
untukexample.com
dansub.example.com
.subexample.com
. Anda harus mengubahnya ke:((.*\.)?example\.org)
Berikut ini cara mengulang kembali header Asal jika cocok dengan domain Anda dengan Nginx, ini berguna jika Anda ingin menyajikan font beberapa sub-domain:
sumber
.
in example.org diartikan sebagai nilai karena ini adalah ekspresi reguler? Dalam hal ini, apakah ini keliru akan memungkinkan TLD contoh-org kustom?"^example\.org$"
karena Anda perlu memastikan seorang peretas tidak dapat menyelinap melalui regex Anda dengansubdomainexample.org
(menggunakan^
) atauexample.orgevil
(menggunakan$
) atauexamplezorg
(melarikan diri\.
)Inilah yang saya lakukan untuk aplikasi PHP yang diminta oleh AJAX
Jika asal yang diminta diizinkan oleh server saya, kembalikan
$http_origin
sendiri sebagai nilaiAccess-Control-Allow-Origin
tajuk alih-alih mengembalikan*
wildcard.sumber
Ada satu kelemahan yang harus Anda ketahui: Segera setelah Anda meng-out-source file ke CDN (atau server lain yang tidak mengizinkan skrip) atau jika file Anda di-cache pada proxy, mengubah respons berdasarkan 'Asal' header permintaan tidak akan berfungsi.
sumber
Vary: Origin
tidak didukung oleh Akamai , salah satu CDN terbesar di luar sana ... Lebih detail juga tersedia di siniUntuk banyak domain, di
.htaccess
:sumber
Header set Vary Origin
akan menjadi tambahan yang bagus untuk jawaban ini.AccessControlAllowOrigin=$0$1
keAccessControlAllowOrigin=$0
. Kalau tidak, itu tidak berfungsi untuk asal HTTPS.http://example.com
keluar dengan benar, tetapihttps://example.com
keluar sebagaihttps://example.coms
, dengan tambahans
di akhir.Untuk pengguna Nginx untuk memungkinkan CORS untuk banyak domain. Saya suka contoh @ marshall meskipun jawaban hanya cocok dengan satu domain. Untuk mencocokkan daftar domain dan subdomain regex ini membuatnya mudah untuk bekerja dengan font:
Ini hanya akan menggemakan tajuk "Akses-Kontrol-Bolehkan-Asal" yang cocok dengan daftar domain yang diberikan.
sumber
Untuk IIS 7.5+ dengan modul URL Rewrite 2.0 diinstal silakan lihat jawaban SO ini
sumber
Inilah solusi untuk aplikasi web Java, berdasarkan jawaban dari yesthatguy.
Saya menggunakan Jersey REST 1.x
Konfigurasikan web.xml untuk mengetahui Jersey REST dan CORSResponseFilter
Berikut kode untuk CORSResponseFilter
sumber
Seperti disebutkan di atas,
Access-Control-Allow-Origin
harus unik danVary
harus ditetapkanOrigin
jika Anda berada di belakang CDN (Jaringan Pengiriman Konten).Bagian yang relevan dari konfigurasi Nginx saya:
sumber
set $cors
semacam makna tersembunyi, atau hanya khusus untuk conifg Anda? sepertinya itu bisa dihilangkan bersama dengan yang keduaif
Mungkin saya salah, tetapi sejauh yang saya bisa lihat
Access-Control-Allow-Origin
memiliki"origin-list"
parameter sebagai.Dengan definisi sebuah
origin-list
adalah:Dan dari sini, saya berpendapat bahwa asal-usul yang berbeda diakui dan harus dipisahkan ruang .
sumber
5.1 Access-Control-Allow-Origin Response Header
menyatakan bahwa asal-list dibatasi: Daripada membiarkan daftar ruang yang dipisahkan dari asal-usul, itu adalah baik asal tunggal atau string "nol".Untuk aplikasi ExpressJS Anda dapat menggunakan:
sumber
Saya kesulitan mengatur ini untuk domain yang menjalankan HTTPS, jadi saya pikir saya akan membagikan solusinya. Saya menggunakan arahan berikut dalam file httpd.conf saya :
Ubah
example.com
nama domain Anda. Tambahkan ini di<VirtualHost x.x.x.x:xx>
dalam file httpd.conf Anda . Perhatikan bahwa jika AndaVirtualHost
memiliki akhiran port (mis.:80
) Maka arahan ini tidak akan berlaku untuk HTTPS, jadi Anda juga harus pergi ke /etc/apache2/situss available/ default-ssl dan tambahkan arahan yang sama dalam file itu, di dalamnya dari<VirtualHost _default_:443>
bagian.Setelah file konfigurasi diperbarui, Anda harus menjalankan perintah berikut di terminal:
sumber
^http(s)?://(.+\.)?example\.com(:\d+)?$
Jika Anda mengalami masalah dengan font, gunakan:
sumber
Pendekatan yang lebih fleksibel adalah dengan menggunakan ekspresi Apache 2.4. Anda dapat mencocokkan dengan domain, jalur, dan hampir setiap variabel permintaan lainnya. Meskipun respons yang dikirim selalu
*
, hanya pemohon yang menerimanya yang memenuhi persyaratan. MenggunakanOrigin
tajuk permintaan (atau yang lainnya) dalam ekspresi menyebabkan Apache untuk secara otomatis menggabungkannya keVary
tajuk respons, sehingga respons tidak akan digunakan kembali untuk asal yang berbeda.sumber
*
dengan kredensial seperti Login. Jadi akan lebih baik jika Anda melewatkan nama host yang cocok daripada*
.Access-Control-Allow-Origin
header untukOPTIONS
permintaan preflight yang memeriksa header untuk melihat apakah server mengizinkan asal ini. Saya sudah memperbaikinya. Jadi*
bukan masalah sebenarnya bagi saya. Tapi, masih beberapa browser tidak menerima*
dengan mandat, sehingga saat Aplikasi Web mengirimkan permintaan Cross-Origin, mereka HARUS menentukanHTTP_ORIGIN
header yang mungkin Anda mengakses secara dinamis dengan variabelOrigin
di.htaccess
untuk Apache, atau$_SERVER['HTTP_ORIGIN'];
PHP. Pokoknya solusi Anda baik karena memungkinkan semua asal, tetapi kurang aman*
memungkinkan segalanya. 2) HOST berbeda dari ASAL. HOST adalah 'TARGET HOST' yang sebenarnya yang dikirimkan ke header permintaan. Tapi ASLI adalahINITIAL HOST
yang mengirim permintaan keTARGET HOST
. Karenanya dalam kode Anda,ORIGIN HOST
diabaikan dan tidak pernah digunakan. Lihat jawaban di atas dan Anda akan melihat bagaimana mereka menggunakanORIGIN
nilai untuk menambahkannyaAccess-Control-Allow-Origin
.*
Tidak mengizinkan semua orang karena menggunakanOrigin
tajuk permintaan dalam ekspresi menyebabkan Apache untuk secara otomatis menggabungkannya keVary
tajuk respons, kecuali jika salah satu menggunakanreq_novary('Origin')
(kemungkinan tidak diinginkan). Peramban tahu bahwa mereka mungkin mendapatkan respons berbeda untuk yang berbedaOrigin
dan jika nilai yang dikirim tidak lulus pengujian,Access-Control-Allow-Origin
tajuk itu tidak pernah disetel.Kode PHP:
sumber
HTTP_ORIGIN tidak digunakan oleh semua browser. Seberapa amankah HTTP_ORIGIN? Bagi saya itu muncul kosong di FF.
Saya memiliki situs yang saya izinkan akses ke situs saya mengirim melalui ID situs, saya kemudian memeriksa DB saya untuk catatan dengan id itu dan mendapatkan nilai kolom SITE_URL (www.yoursite.com).
Bahkan jika pengiriman melalui ID situs yang valid, permintaan harus dari domain yang tercantum dalam DB saya yang terkait dengan ID situs tersebut.
sumber
Berikut adalah opsi yang diperluas untuk apache yang mencakup beberapa definisi font terbaru dan terencana:
sumber
Untuk memfasilitasi beberapa akses domain untuk layanan ASMX, saya membuat fungsi ini di file global.asax:
Ini memungkinkan penanganan CORS untuk
OPTIONS
kata kerja juga.sumber
Contoh kode PHP untuk subdomain yang cocok.
sumber
Untuk copy / paste yang cukup mudah untuk aplikasi .NET, saya menulis ini untuk mengaktifkan CORS dari dalam
global.asax
file. Kode ini mengikuti saran yang diberikan dalam jawaban yang saat ini diterima, yang mencerminkan asal apa pun yang diberikan dalam permintaan ke dalam respons. Ini secara efektif mencapai '*' tanpa menggunakannya.Alasannya adalah ini memungkinkan beberapa fitur CORS lainnya , termasuk kemampuan untuk mengirim AJAX XMLHttpRequest dengan atribut 'withCredentials' yang disetel ke 'true'.
sumber
Dan satu jawaban lagi di Django. Untuk memiliki satu tampilan memungkinkan CORS dari beberapa domain, berikut ini adalah kode saya:
sumber
AWS Lambda / API Gateway
Untuk informasi tentang cara mengonfigurasi beberapa asal pada Serverless AWS Lambda dan API Gateway - meskipun solusi yang agak besar untuk sesuatu yang orang merasa harus cukup mudah - lihat di sini:
https://stackoverflow.com/a/41708323/1624933
Saat ini tidak memungkinkan untuk mengonfigurasi beberapa asal di API Gateway, lihat di sini: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html ), tetapi rekomendasinya (dalam jawaban di atas) adalah:
Solusi sederhana ini jelas mengaktifkan SEMUA (*) seperti:
Tetapi mungkin lebih baik untuk melakukan ini di sisi API Gateway (lihat tautan ke-2 di atas).
sumber
Access-Control-Allow-Credentials: true
tidak diperbolehkan dengan wildcardAccess-Control-Allow-Origin: *
. Tetapkan yang spesifik<origin>
sebagai gantinya.Dukungan Google menjawab pada penyajian iklan melalui SSL dan tata bahasa di RFC itu sendiri tampaknya menunjukkan bahwa Anda dapat membatasi ruang URL. Tidak yakin seberapa baik ini didukung di browser yang berbeda.
sumber
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Jika Anda mencoba begitu banyak contoh kode seperti saya untuk membuatnya berfungsi menggunakan CORS, perlu disebutkan bahwa Anda harus menghapus cache terlebih dahulu untuk mencoba jika itu benar-benar berfungsi, mirip dengan masalah seperti ketika gambar lama masih ada, bahkan jika itu dihapus di server (karena masih disimpan dalam cache Anda).
Misalnya CTRL + SHIFT + DELdi Google Chrome untuk menghapus cache Anda.
Ini membantu saya menggunakan kode ini setelah mencoba banyak
.htaccess
solusi murni dan ini sepertinya satu-satunya yang berfungsi (setidaknya bagi saya):Perhatikan juga bahwa ini tersebar luas sehingga banyak solusi mengatakan Anda harus mengetik
Header set ...
tetapi memang demikianHeader add ...
. Semoga ini bisa membantu seseorang yang memiliki masalah yang sama selama beberapa jam sekarang seperti saya.sumber
Jawaban di bawah ini khusus untuk C #, tetapi konsep tersebut harus berlaku untuk semua platform yang berbeda.
Untuk mengizinkan Permintaan Lintas Asal dari api web, Anda harus mengizinkan permintaan Opsi ke Aplikasi Anda dan Menambahkan anotasi di bawah pada tingkat pengontrol.
[EnableCors (UrlString, Header, Method)] Sekarang asal hanya dapat diteruskan sebagai string. JADI, jika Anda ingin mengirimkan lebih dari satu URL dalam permintaan, berikan sebagai nilai yang dipisah koma.
UrlString = " https: //a.hello.com,https: //b.hello.com "
sumber
Hanya satu sumber yang dapat ditentukan untuk header Access-Control-Allow-Origin. Tetapi Anda dapat mengatur asal dalam respons Anda sesuai dengan permintaan. Juga jangan lupa mengatur header Vary. Dalam PHP saya akan melakukan hal berikut:
sumber
Kami juga dapat mengatur ini di file Global.asax untuk aplikasi Asp.net.
sumber