Come aggiungere un'intestazione Access-Control-Allow-Origin


99

Sto progettando un sito web (es. Mywebsite.com) e questo sito carica i font font-face da un altro sito (diciamo anothersite.com). Ho riscontrato problemi con il caricamento del carattere del tipo di carattere in Firefox e ho letto su questo blog :

Firefox (che supporta @ font-face dalla v3.5) non consente i caratteri interdominio per impostazione predefinita. Ciò significa che il font deve essere offerto dallo stesso dominio (e sottodominio) a meno che non sia possibile aggiungere un'intestazione "Access-Control-Allow-Origin" al font.

Come posso impostare l'intestazione Access-Control-Allow-Origin sul carattere?


ha trovato questo correlate: stackoverflow.com/q/14003332/1423096
alo Malbarez

Risposte:


164

Quindi quello che fai è ... Nella cartella dei file dei caratteri metti un file htaccess con quanto segue.

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

anche nel file CSS remoto, la dichiarazione font-face richiede l'URL assoluto completo del file font (non necessario nei file CSS locali):

per esempio

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

}

Questo risolverà il problema. Una cosa da notare è che puoi specificare esattamente quali domini dovrebbero essere autorizzati ad accedere al tuo carattere. Nell'htaccess sopra ho specificato che tutti possono accedere al mio font con "*"tuttavia puoi limitarlo a:

Un unico URL:

Set di intestazioni Access-Control-Allow-Origin http://example.com

O un elenco di URL delimitato da virgole

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

(Più valori non sono supportati nelle implementazioni correnti)


1
Non è necessario utilizzare percorsi completi. Semplice url('/fonts/League_Gothic.woff') format('woff')è sufficiente supponendo che si mantenga la cartella "fonts" nella stessa directory del file .css.
StrayObject

1
Questa soluzione è valida anche per richieste cross domain .ajax !! Bello!
Isaac

3
@StrayObject: il file CSS remoto dovrà utilizzare i percorsi completi. Il file CSS locale non deve.
Mazatec

Apparentemente non è possibile inserire nella whitelist più URL, delimitati da virgole o altro; vedi bug 671608
Tgr

1
Questa risposta ( stackoverflow.com/a/4110601 ) sembra suggerire che un elenco separato da virgole non funziona
Asaf

21

Secondo i documenti ufficiali , ai browser non piace quando si utilizza l'estensione

Access-Control-Allow-Origin: "*"

se utilizzi anche il file

Access-Control-Allow-Credentials: "true"

intestazione. Invece, vogliono che tu consenta la loro origine in modo specifico. Se vuoi comunque consentire tutte le origini, puoi fare qualche semplice magia di Apache per farlo funzionare (assicurati di aver mod_headersabilitato):

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

I browser devono inviare l' Originintestazione su tutte le richieste interdominio. I documenti affermano specificamente che è necessario riportare questa intestazione Access-Control-Allow-Originnell'intestazione se si accetta / si prevede di accettare la richiesta. Questo è ciò che Headersta facendo questa direttiva.


2
questo sembra funzionare anche per me, anche se sembra avere l'effetto collaterale di dover svuotare la cache se visiti due diversi siti che accedono al sito
Jack James

1
@ Jack: sì, è importante per i contenuti CDN (guardandoti, file di font). A seconda delle impostazioni di memorizzazione nella cache, potresti ritrovarti con il contenuto del file e un'intestazione CORS errata persistente localmente (come nel tuo scenario) o sul proxy! (il busting della cache ?yourdomainfunziona in quest'ultimo caso, ma svaluta un po 'i vantaggi dell'utilizzo di un CDN)
ov

2
Per alcuni motivi, HTTP_ORIGIN non è impostato per me, ho dovuto aggiungere questa riga SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1.
David Riccitelli

5

La risposta accettata non funziona per me sfortunatamente, poiché i file CSS del mio sito @importano i file CSS dei font e questi sono tutti archiviati su un CDN di Rackspace Cloud Files.

Poiché le intestazioni di Apache non vengono mai generate (poiché il mio CSS non è su Apache), ho dovuto fare diverse cose:

  1. Vai all'interfaccia utente di Cloud Files e aggiungi un'intestazione personalizzata (Access-Control-Allow-Origin con valore *) per ogni file con caratteri fantastici
  2. Modificare il tipo di contenuto dei file woff e ttf rispettivamente in font / woff e font / ttf

Vedi se riesci a cavartela con solo # 1, poiché il secondo richiede un po 'di lavoro da riga di comando.

Per aggiungere l'intestazione personalizzata in # 1:

  • visualizzare il contenitore dei file cloud per il file
  • scorri verso il basso fino al file
  • fare clic sull'icona a forma di ingranaggio
  • fare clic su Modifica intestazioni
  • selezionare Access-Control-Allow-Origin
  • aggiungi il carattere singolo "*" (senza virgolette)
  • premi invio
  • ripetere per gli altri file

Se devi continuare e fare # 2, allora avrai bisogno di una riga di comando con 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

Dai risultati restituiti, estrai i valori per X-Auth-Token e 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

Ovviamente, questo processo funziona solo se stai utilizzando il CDN di Rackspace. Altri CDN possono offrire servizi simili per modificare le intestazioni degli oggetti e cambiare i tipi di contenuto, quindi forse sarai fortunato (e pubblicherai alcune informazioni extra qui).


3

Per l'applicazione basata su Java, aggiungilo al tuo file web.xml:

<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

Nel tuo file.php di richiesta ajax, puoi impostare il valore di intestazione.

<?php header('Access-Control-Allow-Origin: *'); //for all ?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.