Puis-je définir un en-tête Access-Control-Allow-Origin pour toutes les pages d'un domaine et de ses sous-domaines?
Je suis en train d'utiliser une webfont qui je suis légalement autorisé à utiliser, mais pas de distribuer. Je suis d'hébergement de fichiers de polices de caractères sur un domaine distinct utilisé pour le contenu statique. Les deux domaines sont indépendants (l'un n'est pas un sous-domaine de l'autre). Disons que le site à l'aide de la webfont est example.com
et le site d'hébergement, il est example.net
.
J'ai essayé ce dans le .fichier htaccess sur example.net
<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "example.com"
</IfModule>
</FilesMatch>
Cependant, cela permet à la police de travailler uniquement sur la page d'accueil de example.com
. J'ai essayé de nouveau:
Header set Access-Control-Allow-Origin "example.com/*"
Maintenant la police fonctionne sur example.com
partout à l'exception de la page d'accueilqui est (évidemment) pas ce que je voulais.
Je ne trouve pas de documentation pour cet en-tête. Ce que je veux vraiment, c'est de permettre toutes les pages sur example.com
et www.example.com
(ou, pour faire bonne mesure, *.example.com
). Est-il un moyen simple de faire cela? Je devine que l'en-tête prend une sorte de regex.
À chercher de la documentation, j'ai trouvé,
- beaucoup de choses sur la façon dont cet en-tête interagit avec l'ajax,
- beaucoup de notes brèves dire qu'il est nécessaire pour les polices web (au moins dans Firefox).
Je n'ai pas trouvé de documentation sur la syntaxe de l'en-tête lui-même, ou comment spécifier les variantes d'un nom de domaine.
Basé sur une réponse à une question relative à laj'ai essayé ceci:
<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(example.com)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials true
</IfModule>
</FilesMatch>
Ma compréhension était que cela créerait un en-tête séparée pour chaque demande, permettant à chaque page de requête individuellement pour utiliser la police de caractères. Vérification avec Firebug, même si, il ressemble à l'en-tête est toujours http://example.com
à la fois sur la page d'accueil et d'ailleurs. Néanmoins, cela fonctionne, mais me laisse confus. Une question connexe montre que un semblable programme d'installation n'a pas été de travailler pour quelqu'un d'autre. Sa question suggère que, pour lui, il en fait était l'envoi d'un en-tête différent pour chaque page de requête, et que HTTP 304 Not Modified
réponses ont donc été la rupture. Sa solution était d'ajouter une always
directive de la .htaccess
mais pour moi qui a abouti à HTTP 500
erreurs.
Comme il est maintenant, ça fonctionne, et je pense va continuer à travailler quand example.com
commutateurs à HTTPS (comme il le fera sous peu). Cependant, je ne peux pas aider mais se sentent que c'est trop compliqué. Il donne le même en-tête, à chaque fois, mais en utilisant complexe "pattern-matching" de le faire. Aussi, bien que je n'ai pas encore de problèmes avec HTTP 304 Not Modified
réponses (en fait, je n'ai pas encore vu toutes ces réponses: le navigateur n'est pas simplement demander les fichiers de police à tous jusqu'à ce que j'ai vider le cache), je crains que je pourrais le voir dans l'avenir.
source d'informationauteur TRiG
Vous devez vous connecter pour publier un commentaire.
Comme l'a déclaré le La SCRO specvous pouvez avoir un seul domaine dans le
Access-Control-Allow-Origin
en-tête (ou*
ounull
).Alors oui, vous devez définir l'en-tête différemment en fonction de ce domaine est la demande du site. C'est pourquoi la config d'apache extrait de code que vous avez posté essaie de match sur le
Origin
en-tête de la demande avec ce regex:La
$
correspond à la fin de la chaîne. Donc, cette expression va correspondre à des demandes dehttp://www.example.com
http://example.com
et leurs équivalents https, mais pasexample.com/bla
. Ce devrait être bon depuis leOrigin
en-tête de la demande, ainsi que laAccess-Control-Allow-Origin
en-tête de la réponse doit contenir seul l'hôte et non pas les sous-pages.Ainsi, lorsque vous êtes sur la page
http://example.com/about-us
le navigateur va envoyer quelque chose comme la requête suivante pour obtenir la police dehttp://cdn.net/myfont.otf
:Il y a le serveur patternmatch sur l'en-tête d'Origine et de retour avec:
Pour la référence, j'ai été mise à jour le /etc/apache2/conf/sites-enabled/* fichiers dans le même but. Mon code:
Une chose que j'ai eu à traiter avec - je n'ai pas eu mod_headers activé, de sorte que le redémarrage d'apache a échoué. J'ai dû activer qu'avec