Cara menambahkan header Access-Control-Allow-Origin

99

Saya merancang sebuah situs web (mis. Mywebsite.com) dan situs ini memuat font font-face dari situs lain (katakanlah anothersite.com). Saya mengalami masalah dengan pemuatan font font face di Firefox dan saya membaca di blog ini :

Firefox (yang mendukung @ font-face dari v3.5) tidak mengizinkan font lintas domain secara default. Ini berarti font harus disajikan dari domain yang sama (dan sub-domain) kecuali Anda dapat menambahkan header "Access-Control-Allow-Origin" ke font.

Bagaimana cara mengatur header Access-Control-Allow-Origin ke font?

Mazatec
sumber
menemukan ini terkait: stackoverflow.com/q/14003332/1423096
alo Malbarez

Jawaban:

164

Jadi apa yang Anda lakukan adalah ... Di folder file font letakkan file htaccess dengan berikut di dalamnya.

<FilesMatch "\.(ttf|otf|eot|woff|woff2)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

juga di file CSS jarak jauh Anda, deklarasi font-face memerlukan URL absolut lengkap dari file font (tidak diperlukan dalam file CSS lokal):

misalnya

@font-face {
    font-family: 'LeagueGothicRegular';
    src: url('http://www.example.com/css/fonts/League_Gothic.eot?') format('eot'),
         url('http://www.example.com/css/fonts/League_Gothic.woff') format('woff'),
         url('http://www.example.com/css/fonts/League_Gothic.ttf') format('truetype'),
         url('http://www.example.com/css/fonts/League_Gothic.svg')

}

Itu akan memperbaiki masalah. Satu hal yang perlu diperhatikan adalah Anda dapat menentukan dengan tepat domain mana yang harus diizinkan untuk mengakses font Anda. Dalam htaccess di atas saya telah menetapkan bahwa setiap orang dapat mengakses font saya dengan "*"bagaimanapun Anda dapat membatasinya menjadi:

Satu URL:

Kumpulan header Access-Control-Allow-Origin http://example.com

Atau daftar URL yang dipisahkan koma

Access-Control-Allow-Origin: http://site1.com,http://site2.com

(Beberapa nilai tidak didukung dalam implementasi saat ini)

Mazatec
sumber
1
Anda tidak harus menggunakan jalur lengkap. Sederhana saja url('/fonts/League_Gothic.woff') format('woff')cukup dengan asumsi Anda menyimpan folder 'font' di direktori yang sama dengan file .css Anda.
StrayObject
1
Solusi ini juga berlaku untuk permintaan .ajax lintas domain !! Bagus!
Ishak
3
@StrayObject - file CSS jarak jauh perlu menggunakan jalur lengkap. File CSS lokal tidak harus.
Mazatec
Tampaknya tidak mungkin untuk memasukkan banyak URL ke daftar putih, dipisahkan koma atau sebaliknya; melihat bug 671.608
Tgr
1
Jawaban ini ( stackoverflow.com/a/4110601 ) tampaknya menyarankan bahwa daftar yang dipisahkan koma tidak berfungsi
Asaf
21

Menurut dokumen resmi , browser tidak suka saat Anda menggunakan

Access-Control-Allow-Origin: "*"

header jika Anda juga menggunakan

Access-Control-Allow-Credentials: "true"

header. Sebaliknya, mereka ingin Anda mengizinkan asal mereka secara khusus. Jika Anda masih ingin mengizinkan semua asal, Anda dapat melakukan sihir Apache sederhana untuk membuatnya berfungsi (pastikan Anda telah mod_headersmengaktifkannya):

Header set Access-Control-Allow-Origin "%{HTTP_ORIGIN}e" env=HTTP_ORIGIN

Browser harus mengirimkan Originheader pada semua permintaan lintas domain. Dokumen secara khusus menyatakan bahwa Anda perlu meng-echo header ini kembali di Access-Control-Allow-Originheader jika Anda menerima / berencana untuk menerima permintaan tersebut. Itulah yang dilakukan Headerarahan ini.

laughingbovine
sumber
2
yang tampaknya bekerja untuk saya juga, meskipun tampaknya memiliki efek samping karena harus membersihkan tembolok jika Anda mengunjungi dua situs berbeda yang mengakses situs
Jack James
1
@ Jack: ya, itu yang besar untuk konten CDN (melihat Anda, file font). Bergantung pada pengaturan cache, Anda bisa mendapatkan konten file dan header CORS yang salah tetap ada secara lokal (seperti dalam skenario Anda) atau pada proxy! (perusak cache dengan ?yourdomainbekerja dalam kasus terakhir, tetapi meremehkan manfaat menggunakan CDN sedikit)
ov
2
Untuk beberapa alasan, HTTP_ORIGIN tidak disetel untuk saya, saya harus menambahkan baris ini SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1.
David Riccitelli
5

Sayangnya, jawaban yang diterima tidak berfungsi untuk saya, karena file CSS situs saya @import file font CSS, dan ini semua disimpan di Rackspace Cloud Files CDN.

Karena header Apache tidak pernah dibuat (karena CSS saya tidak ada di Apache), saya harus melakukan beberapa hal:

  1. Buka Cloud Files UI dan tambahkan header khusus (Access-Control-Allow-Origin dengan nilai *) untuk setiap file font-awesome
  2. Ubah Content-Type dari file woff dan ttf menjadi font / woff dan font / ttf

Lihat apakah Anda bisa lolos hanya dengan # 1, karena yang kedua membutuhkan sedikit pekerjaan baris perintah.

Untuk menambahkan tajuk khusus di # 1:

  • lihat penampung file cloud untuk file tersebut
  • gulir ke bawah ke file
  • klik ikon roda gigi
  • klik Edit Headers
  • pilih Access-Control-Allow-Origin
  • tambahkan karakter tunggal '*' (tanpa tanda kutip)
  • tekan enter
  • ulangi untuk file lainnya

Jika Anda perlu melanjutkan dan melakukan # 2, Anda memerlukan baris perintah dengan CURL

curl -D - --header "X-Auth-Key: your-auth-key-from-rackspace-cloud-control-panel" --header "X-Auth-User: your-cloud-username" https://auth.api.rackspacecloud.com/v1.0

Dari hasil yang dikembalikan, ekstrak nilai untuk X-Auth-Token dan X-Storage-Url

curl -X POST \
  -H "Content-Type: font/woff" \
  --header "X-Auth-Token: returned-x-auth-token" returned-x-storage-url/name-of-your-container/fonts/fontawesome-webfont.woff

curl -X POST \
  -H "Content-Type: font/ttf" \
  --header "X-Auth-Token: returned-x-auth-token" returned-x-storage-url/name-of-your-container/fonts/fontawesome-webfont.ttf

Tentu saja, proses ini hanya berfungsi jika Anda menggunakan Rackspace CDN. CDN lain mungkin menawarkan fasilitas serupa untuk mengedit tajuk objek dan mengubah tipe konten, jadi mungkin Anda akan beruntung (dan memposting beberapa info tambahan di sini).

Phil
sumber
3

Untuk Aplikasi berbasis Java, tambahkan ini ke file web.xml Anda:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.ttf</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.otf</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.eot</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.woff</url-pattern>
</servlet-mapping>
Neon Sun
sumber
1

Di file.php Anda dari request ajax, dapat mengatur nilai header.

<?php header('Access-Control-Allow-Origin: *'); //for all ?>
Santos L. Victor
sumber