Pembaruan 10 September 2014:
Anda tidak perlu lagi melakukan peretasan string kueri di bawah ini karena Cloudfront mendukung CORS dengan benar sekarang. Lihat http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/ dan jawaban ini untuk info lebih lanjut: https://stackoverflow.com/a/25305915/308315
OK, saya akhirnya membuat font bekerja menggunakan konfigurasi di bawah ini dengan sedikit perubahan dari contoh dalam dokumentasi.
Font saya di-host pada S3, tetapi digawangi oleh cloudfront.
Saya tidak yakin mengapa itu berhasil, dugaan saya mungkin <AllowedMethod>
GET
dan <AllowedHeader>
Content-*
diperlukan.
Jika ada yang mahir dengan konfigurasi Amazon S3 CORS dapat menjelaskan ini, itu akan sangat dihargai.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://mydomain.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>https://*.mydomain.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
</CORSRule>
</CORSConfiguration>
edit:
Beberapa pengembang menghadapi masalah caching Access-Control-Allow-Origin
header Cloudfront . Masalah ini telah diatasi oleh staf AWS di tautan ( https://forums.aws.amazon.com/thread.jspa?threadID=114646 ) di bawah ini, dikomentari oleh @ Jeff-Atwood.
Dari utas tertaut, disarankan, sebagai solusi, untuk menggunakan String Kueri untuk membedakan antara panggilan dari domain yang berbeda. Saya akan mereproduksi contoh singkat di sini.
Menggunakan curl
untuk memeriksa header respons:
Domain A: a.domain.com
curl -i -H "Origin: https://a.domain.com" http://hashhashhash.cloudfront.net/font.woff?https_a.domain.com
Header respons dari Domain A:
Access-Control-Allow-Origin: https://a.domain.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
X-Cache: Miss from Cloudfront
Domain B: b.domain.com
curl -i -H "Origin: http://b.domain.com" http://hashhashhash.cloudfront.net/font.woff?http_b.domain.com
Header respons dari Domain B:
Access-Control-Allow-Origin: http://b.domain.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
X-Cache: Miss from Cloudfront
Anda akan melihat Access-Control-Allow-Origin
telah mengembalikan nilai yang berbeda, yang berhasil melewati caching Cloudfront.
Access-Control-Allow-Origin
header di-cache dan membatalkan CORS ketika permintaan selanjutnya dilakukan melalui subdomain yang berbeda?Setelah beberapa tweaker, saya tampaknya telah berhasil ini tanpa peretasan string kueri. Info lebih lanjut di sini: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
Saya akan pergi melalui seluruh pengaturan saya sehingga mudah untuk melihat apa yang telah saya lakukan, semoga ini membantu orang lain.
Informasi Latar Belakang: Saya menggunakan aplikasi Rails yang memiliki permata asset_sync untuk menempatkan aset ke S3. Ini termasuk font.
Di dalam konsol S3, saya mengklik ember, properti, dan 'edit konfigurasi kors' saya, di sini:
Di dalam textarea saya punya sesuatu seperti:
Kemudian di dalam panel Cloudfront ( https://console.aws.amazon.com/cloudfront/home ) saya membuat distribusi, menambahkan Origin yang menunjuk ke ember S3 saya
Kemudian menambahkan perilaku untuk jalur default untuk menunjuk ke pengaturan saya asal S3 berbasis. Apa yang saya juga lakukan adalah mengklik header Daftar Putih dan menambahkan
Origin
:Apa yang terjadi sekarang adalah yang berikut, yang saya yakini benar:
1) Periksa apakah header S3 sedang diatur dengan benar
2) Periksa Cloudfront berfungsi dengan header
(Catatan di atas adalah kehilangan dari cloudfront karena file-file ini di-cache selama 180 detik, tetapi hal yang sama berhasil pada hit)
3) Memukul cloudfront dengan asal yang berbeda (tapi yang diizinkan pada CORS untuk bucket S3) - yang
Access-Control-Allow-Origin
tidak di-cache! yay!Perhatikan di atas bahwa domain berhasil diubah tanpa peretasan string kueri.
Ketika saya mengubah header Origin, sepertinya selalu ada
X-Cache: Miss from cloudfront
pada permintaan pertama kemudian setelah itu saya mendapatkan yang diharapkanX-Cache: Hit from cloudfront
PS Perlu dicatat bahwa ketika melakukan curl -I (modal I) TIDAK akan menunjukkan header Access-Control-Allow-Origin karena hanya HEAD, saya lakukan -i untuk membuatnya GET dan gulir ke atas.
sumber
Origin
dari pemirsa sehingga Cloudfront cache objek berdasarkan header itu (dan meneruskan server CORS header kembali ke pengguna)Font saya disajikan dengan benar hingga dorongan terakhir ke Heroku ... Saya tidak tahu mengapa, tetapi wildcard di CORS yang diizinkan asal berhenti berfungsi. Saya menambahkan semua domain prepro dan pro saya ke kebijakan CORS dalam pengaturan bucket jadi sekarang terlihat seperti ini:
UPDATE: tambahkan
http://localhost:PORT
juga Andasumber
Nah, dokumentasi menyatakan bahwa Anda dapat menempel konfigurasi sebagai "sub-sumber kor dalam ember Anda." Saya menganggap ini berarti saya akan membuat file bernama "cors" di root bucket saya dengan konfigurasi, tetapi ini tidak akan berhasil. Pada akhirnya saya harus masuk ke area administrasi Amazon S3 dan menambahkan konfigurasi dalam
properties
dialog ember saya.S3 dapat menggunakan beberapa dokumentasi yang lebih baik ...
sumber
Dalam konfigurasi Amazon S3 CORS (S3 Bucket / Izin / CORS) jika Anda menggunakan ini:
CORS berfungsi dengan baik untuk file Javascript dan CSS, tetapi itu tidak berfungsi untuk file Font .
Anda harus menentukan domain untuk memungkinkan CORS menggunakan pola yang dinyatakan dalam jawaban @VKen: https://stackoverflow.com/a/25305915/618464
Jadi, gunakan ini :
Ingatlah untuk mengganti "mydomain.com" untuk domain Anda.
Setelah ini, batalkan cache CloudFront (CloudFront / Invalidations / Create Invalidation) dan itu akan berfungsi.
sumber
Dalam kasus saya, saya belum mendefinisikan XML namespace dan versi dalam konfigurasi CORS. Mendefinisikan itu berhasil.
Berubah
untuk
sumber
Ada cara yang lebih baik dan lebih mudah!
Saya pribadi lebih suka menggunakan subdomain DNS saya untuk menyelesaikan masalah ini. Jika CDN saya ada di belakang cdn.myawesomeapp.com alih-alih sdf73n7ssa.cloudfront.net maka browser tidak akan panik dan memblokirnya sebagai masalah keamanan lintas domain.
Untuk mengarahkan subdomain Anda ke domain AWS Cloudfront Anda, buka panel kontrol AWS Cloudfront, pilih distribusi Cloudfront Anda dan masukkan subdomain CDN Anda ke dalam bidang Nama Domain Alternatif (CNAME). Sesuatu seperti cdn.myawesomeapp.com akan dilakukan.
Sekarang Anda dapat pergi ke penyedia DNS Anda (seperti AWS Route 53) dan membuat CNAME untuk cdn.myawesomeapp.com dengan menunjuk ke sdf73n7ssa.cloudfront.net.
http://blog.cloud66.com/cross-origin-resource-sharing-cors-block-for-cloudfront-in-rails/
sumber
Konfigurasi ini bekerja untuk saya. Saya dapat membuat daftar objek, mengambil, memperbarui dan menghapus.
sumber
Solusi Sederhana
sumber
particular domain
atauall domains
)Restart aplikasi boot spring saya (server) memecahkan masalah bagi saya.
Saya telah mengkonfigurasi CORS dengan benar pada S3. Curl memberi respons yang benar dengan header asli. Safari mengambil fon dengan benar. Hanya chrome yang tidak mau menerima CORS.
Tidak yakin apa yang sebenarnya menyebabkan perilaku itu. Pasti ada hubungannya dengan If-modified-since
sumber
Ini tidak terkait dengan font tetapi untuk gambar, itu mungkin kasus tepi, tetapi seperti yang terjadi pada saya, mungkin terjadi pada yang lain. Saya akan meninggalkan ini di sini berharap itu akan membantu seseorang:
Jika Anda berada dalam skenario "Saya telah melakukan semua yang mereka katakan, tetapi masih tidak berhasil" mungkin ini adalah masalah terkait cache di Chrome dan Safari. Misalkan server Anda memiliki set konfigurasi CORS yang tepat:
dan di Firefox semuanya bekerja dengan baik, tetapi di Chrome dan Safari tidak. Jika Anda mengakses ke jalur gambar jauh Anda dari kedua sederhana
<img src="http://my.remote.server.com/images/cat.png">
tag dan dari src js Gambar elemen, seperti dengan cara berikut:Anda mungkin mendapatkan
No 'Access-Control-Allow-Origin'
kesalahan di Chrome dan Safari. Ini terjadi karena yang pertama<img>
entah bagaimana mengacaukan cache browser, dan ketika Anda mencoba untuk mengakses gambar yang sama kemudian (pada elemen Gambar dalam kode), itu hanya rusak. Untuk menghindari ini, Anda dapat menambahkan param GET fiktif ke satu jalur .src, untuk memaksa browser meminta kembali gambar dan menghindari menggunakan cache, seperti ini:sumber
Ya tentu saja. Firefox mendukung CORS untuk font, seperti spesifikasi yang disyaratkan di http://dev.w3.org/csswg/css3-fonts/#allowing-cross-origin-font-loading
sumber