Access-Control-Allow-Origin başlığı nasıl eklenir


99

Bir web sitesi tasarlıyorum (ör. Mywebsite.com) ve bu site başka bir siteden (örneğin anothersite.com) font-face fontları yüklüyor. Firefox'ta yazı tipi yüzü yazı tipi yüklemesiyle ilgili sorunlar yaşıyordum ve bu blogda okudum :

Firefox (v3.5'ten @ font-face'i destekler) varsayılan olarak etki alanları arası yazı tiplerine izin vermez. Bu, yazı tipine bir “Access-Control-Allow-Origin” başlığı ekleyemediğiniz sürece yazı tipinin aynı etki alanından (ve alt etki alanından) sunulması gerektiği anlamına gelir.

Access-Control-Allow-Origin başlığını yazı tipine nasıl ayarlayabilirim?


Yanıtlar:


164

Yani yaptığınız şey ... Yazı tipi dosyaları klasörüne, içinde aşağıdakileri içeren bir htaccess dosyası koyun.

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

ayrıca uzak CSS dosyanızda, font-face bildirimi font dosyasının tam mutlak URL'sine ihtiyaç duyar (yerel CSS dosyalarında gerekli değildir):

Örneğin

@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')

}

Bu sorunu çözecektir. Unutulmaması gereken bir nokta, yazı tipinize tam olarak hangi alan adlarının erişmesine izin verileceğini belirtebilmenizdir. Yukarıdaki htaccess'te herkesin yazı tipime erişebileceğini belirttim, "*"ancak aşağıdakilerle sınırlayabilirsiniz:

Tek bir URL:

Üstbilgi kümesi Erişim-Denetimi-İzin Ver-Kaynak http://example.com

Veya virgülle ayrılmış bir URL listesi

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

(Mevcut uygulamalarda birden çok değer desteklenmemektedir)


1
Tam yolları kullanmak zorunda değilsiniz. Basit url('/fonts/League_Gothic.woff') format('woff'), 'fonts' klasörünü .css dosyanızla aynı dizinde tuttuğunuzu varsayarsak yeterlidir.
StrayObject

1
Bu çözüm, etki alanları arası .ajax istekleri için de geçerlidir !! Güzel!
Isaac

3
@StrayObject - uzak CSS dosyasının tam yolları kullanması gerekir. Yerel CSS dosyasının buna gerek yoktur.
Mazatec

Görünüşe göre birden çok URL'yi virgülle ayrılmış veya başka şekilde beyaz listeye almak mümkün değil; bkz hata 671608
Tgr

1
Bu cevap ( stackoverflow.com/a/4110601 ), virgülle ayrılmış bir listenin çalışmadığını öne sürüyor gibi görünüyor
Asaf

21

Göre resmi dokümanlar kullandığınızda, tarayıcılar bunu sevmiyorum

Access-Control-Allow-Origin: "*"

başlığı da kullanıyorsanız

Access-Control-Allow-Credentials: "true"

başlık. Bunun yerine, özellikle kökenlerine izin vermenizi istiyorlar. Yine de tüm kaynaklara izin vermek istiyorsanız, onu çalıştırmak için bazı basit Apache sihrini yapabilirsiniz ( mod_headersetkinleştirdiğinizden emin olun ):

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

Tarayıcıların Origintüm etki alanları arası isteklerde başlığı göndermesi gerekir . Dokümanlar Access-Control-Allow-Origin, isteği kabul ediyorsanız / kabul etmeyi planlıyorsanız, bu başlığı tekrar başlıkta tekrarlamanız gerektiğini özellikle belirtir . Bu Headerdirektifin yaptığı şey bu .


2
Bu benim için de işe yarıyor gibi görünüyor, ancak siteye erişen iki farklı siteyi ziyaret ederseniz önbelleğinizi temizlemeye ihtiyaç duymanın yan etkisi var gibi görünüyor
Jack James

1
@Jack: evet, CDN içeriği (sana bakmak, yazı tipi dosyaları) için önemli. Önbelleğe alma ayarlarına bağlı olarak, dosya içeriği ve yerel olarak (sizin senaryonuzdaki gibi) veya proxy üzerinde kalan hatalı bir CORS başlığıyla sonuçlanabilir! ( ?yourdomainikinci durumda önbellek bozma , ancak bir CDN kullanmanın faydalarını biraz
düşürür

2
Bazı nedenlerden dolayı HTTP_ORIGIN benim için ayarlanmadı, bu satırı eklemek zorunda kaldım SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1.
David Riccitelli

5

Kabul edilen cevap maalesef benim için işe yaramıyor, çünkü sitem CSS dosyaları font CSS dosyalarını @ içe aktarıyor ve bunların tümü bir Rackspace Bulut Dosyaları CDN'sinde depolanıyor.

Apache başlıkları asla oluşturulmadığından (CSS'm Apache'de olmadığından), birkaç şey yapmam gerekiyordu:

  1. Bulut Dosyaları Kullanıcı Arayüzüne gidin ve her bir harika yazı tipi dosyası için özel bir başlık (değer içeren Access-Control-Allow-Origin *) ekleyin
  2. Woff ve ttf dosyalarının İçerik Türünü sırasıyla font / woff ve font / ttf olarak değiştirin

Bakalım sadece 1 numara ile paçayı sıyırabilir misin, çünkü ikincisi biraz komut satırı çalışması gerektiriyor.

Özel başlığı # 1'e eklemek için:

  • dosya için bulut dosyaları konteynerini görüntüleyin
  • dosyaya ilerleyin
  • dişli simgesini tıklayın
  • Başlıkları Düzenle'yi tıklayın
  • Access-Control-Allow-Origin'i seçin
  • '*' tek karakterini ekleyin (tırnak işaretleri olmadan)
  • Enter'a basın
  • diğer dosyalar için tekrarlayın

Devam etmeniz ve # 2 yapmanız gerekiyorsa, CURL ile bir komut satırına ihtiyacınız olacak

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

Döndürülen sonuçlardan X-Auth-Token ve X-Storage-Url değerlerini çıkarın

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

Elbette, bu işlem yalnızca Rackspace CDN kullanıyorsanız çalışır. Diğer CDN'ler, nesne başlıklarını düzenlemek ve içerik türlerini değiştirmek için benzer olanaklar sunabilir, bu nedenle belki şansınız olur (ve burada bazı ekstra bilgiler yayınlarsınız).


3

Java tabanlı Uygulama için bunu web.xml dosyanıza ekleyin:

<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>


1

Ajax isteğinizin file.php dosyasında değer başlığı ayarlayabilirsiniz.

<?php header('Access-Control-Allow-Origin: *'); //for all ?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.