Comment ajouter un en-tête Access-Control-Allow-Origin

99

Je conçois un site Web (par exemple mywebsite.com) et ce site charge les polices font-face d'un autre site (disons anothersite.com). J'avais des problèmes avec le chargement des polices de caractères dans Firefox et j'ai lu sur ce blog :

Firefox (qui prend en charge @ font-face à partir de la v3.5) n'autorise pas les polices inter-domaines par défaut. Cela signifie que la police doit être servie à partir du même domaine (et sous-domaine), sauf si vous pouvez ajouter un en-tête «Access-Control-Allow-Origin» à la police.

Comment puis-je définir l'en-tête Access-Control-Allow-Origin sur la police?

Mazatec
la source
trouvé ceci lié: stackoverflow.com/q/14003332/1423096
alo Malbarez

Réponses:

164

Donc, ce que vous faites est ... Dans le dossier des fichiers de polices, mettez un fichier htaccess avec les éléments suivants.

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

également dans votre fichier CSS distant, la déclaration font-face a besoin de l'URL absolue complète du fichier de polices (non nécessaire dans les fichiers CSS locaux):

par exemple

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

}

Cela résoudra le problème. Une chose à noter est que vous pouvez spécifier exactement quels domaines doivent être autorisés à accéder à votre police. Dans le htaccess ci-dessus, j'ai spécifié que tout le monde peut accéder à ma police "*"mais vous pouvez la limiter à:

Une seule URL:

Ensemble d'en-têtes Access-Control-Allow-Origin http://example.com

Ou une liste d'URL séparées par des virgules

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

(Les valeurs multiples ne sont pas prises en charge dans les implémentations actuelles)

Mazatec
la source
1
Vous n'êtes pas obligé d'utiliser des chemins complets. Simple url('/fonts/League_Gothic.woff') format('woff')est suffisant en supposant que vous gardiez le dossier 'fonts' dans le même répertoire que votre fichier .css.
StrayObject
1
Cette solution est également valable pour les requêtes .ajax cross domain !! Agréable!
Isaac
3
@StrayObject - le fichier CSS distant devra utiliser les chemins complets. Le fichier CSS local n'est pas obligé.
Mazatec
Il n'est apparemment pas possible de mettre en liste blanche plusieurs URL, délimitées par des virgules ou non; voir bug 671608
Tgr
1
Cette réponse ( stackoverflow.com/a/4110601 ) semble suggérer qu'une liste séparée par des virgules ne fonctionne pas
Asaf
21

Selon la documentation officielle , les navigateurs n'aiment pas lorsque vous utilisez le

Access-Control-Allow-Origin: "*"

en-tête si vous utilisez également le

Access-Control-Allow-Credentials: "true"

entête. Au lieu de cela, ils veulent que vous autorisiez spécifiquement leur origine. Si vous souhaitez toujours autoriser toutes les origines, vous pouvez faire de la magie Apache simple pour le faire fonctionner (assurez-vous que vous avez mod_headersactivé):

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

Les navigateurs sont tenus d'envoyer l'en- Origintête sur toutes les demandes inter-domaines. Les documents indiquent spécifiquement que vous devez renvoyer cet en-tête dans l'en- Access-Control-Allow-Origintête si vous acceptez / prévoyez d'accepter la demande. C'est ce que fait cette Headerdirective.

rire bovin
la source
2
cela semble fonctionner pour moi aussi, bien que cela semble avoir pour effet secondaire de devoir vider votre cache si vous visitez deux sites différents qui accèdent au site
Jack James
1
@Jack: oui, c'est un gros problème pour le contenu CDN (en vous regardant, les fichiers de polices). Selon les paramètres de mise en cache, vous pourriez vous retrouver avec le contenu du fichier et un en-tête CORS incorrect persistant localement (comme dans votre scénario) ou sur un proxy! (cache-busting avec des ?yourdomainœuvres dans ce dernier cas, mais dévalue les avantages d'utiliser un CDN un peu)
ov
2
Pour certaines raisons, HTTP_ORIGIN n'est pas défini pour moi, j'ai dû ajouter cette ligne SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1.
David Riccitelli
5

La réponse acceptée ne fonctionne malheureusement pas pour moi, car les fichiers CSS de mon site @importent les fichiers CSS de polices, et ceux-ci sont tous stockés sur un CDN Rackspace Cloud Files.

Puisque les en-têtes Apache ne sont jamais générés (puisque mon CSS n'est pas sur Apache), j'ai dû faire plusieurs choses:

  1. Accédez à l'interface utilisateur de Cloud Files et ajoutez un en-tête personnalisé (Access-Control-Allow-Origin avec valeur *) pour chaque fichier font-awesome
  2. Changez le Content-Type des fichiers woff et ttf en font / woff et font / ttf respectivement

Voyez si vous pouvez vous en tirer avec juste le # 1, car le second nécessite un peu de travail en ligne de commande.

Pour ajouter l'en-tête personnalisé dans # 1:

  • afficher le conteneur de fichiers cloud du fichier
  • faites défiler jusqu'au fichier
  • cliquez sur l'icône de la roue dentée
  • cliquez sur Modifier les en-têtes
  • sélectionnez Access-Control-Allow-Origin
  • ajoutez le caractère unique '*' (sans les guillemets)
  • appuyez sur Entrée
  • répéter pour les autres fichiers

Si vous devez continuer et faire le n ° 2, vous aurez besoin d'une ligne de commande avec 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

À partir des résultats renvoyés, extrayez les valeurs de X-Auth-Token et 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

Bien sûr, ce processus ne fonctionne que si vous utilisez le CDN Rackspace. D'autres CDN peuvent offrir des fonctionnalités similaires pour éditer les en-têtes d'objet et changer les types de contenu, alors peut-être que vous aurez de la chance (et publierez des informations supplémentaires ici).

Phil
la source
3

Pour une application basée sur Java, ajoutez ceci à votre fichier 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>
Soleil néon
la source
1

Dans votre fichier.php de la requête ajax, vous pouvez définir l'en-tête de valeur.

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