1168 votes

<div>Access-Control-Allow-Origin Domaines d'origine multiples?</div>

Y a-t-il un moyen de permettre plusieurs domaines croisés en utilisant l'en-tête Access-Control-Allow-Origin ?

Je connais le *, mais c'est trop ouvert. Je veux vraiment autoriser seulement quelques domaines.

Par exemple, quelque chose comme ceci :

Access-Control-Allow-Origin: http://domain1.example, http://domain2.example

J'ai essayé le code ci-dessus mais cela ne semble pas fonctionner dans Firefox.

Est-il possible de spécifier plusieurs domaines ou suis-je coincé avec un seul ?

3 votes

En utilisant le navigateur Firefox le plus récent, ni les domaines séparés par des virgules ni les domaines séparés par des espaces n'ont fonctionné. Faire correspondre une liste de domaines et mettre un unique hôte dans les en-têtes est toujours une meilleure sécurité et fonctionne correctement.

2 votes

Si vous avez des difficultés avec cela pour HTTPS, j'ai trouvé une solution.

943voto

yesthatguy Points 2612

Il semble que la façon recommandée de le faire est de permettre à votre serveur de lire l'en-tête Origin du client, de le comparer à la liste des domaines que vous souhaitez autoriser, et si cela correspond, d'échoir la valeur de l'en-tête Origin de retour au client en tant qu'en-tête Access-Control-Allow-Origin dans la réponse.

Avec .htaccess, vous pouvez le faire comme ceci :

# ----------------------------------------------------------------------
# Autoriser le chargement de polices externes
# ----------------------------------------------------------------------

        SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.example|dev02.otherdomain.example)$" AccessControlAllowOrigin=$0
        Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
        Header merge Vary Origin

0 votes

Comment ajouter des sous-domaines génériques comme : *.example.com ou des ports génériques comme : localhost:*

0 votes

Pour ceux qui se demandent, vous pouvez faire (.+\.google.com) au lieu de (google.com|staging.google.com)

249voto

Nikolay Ivanov Points 739

Une autre solution que j'utilise en PHP:

$http_origin = $_SERVER['HTTP_ORIGIN'];

if ($http_origin == "http://www.domain1.com" || $http_origin == "http://www.domain2.com" || $http_origin == "http://www.domain3.com")
{  
    header("Access-Control-Allow-Origin: $http_origin");
}

124voto

Jay Dave Points 577

Cela a fonctionné pour moi:

SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.example|domain2\.example)$" origin_is=$0 
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is

Lorsque placé dans .htaccess, cela fonctionnera certainement.

93voto

Staugaard Points 629

J'ai eu le même problème avec les polices woff, plusieurs sous-domaines devaient avoir accès. Pour autoriser les sous-domaines, j'ai ajouté quelque chose comme ceci à mon fichier httpd.conf :

SetEnvIf Origin "^(.*\.exemple\.com)$" ORIGIN_SUB_DOMAIN=$1

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

Pour plusieurs domaines, vous pourriez simplement changer l'expression régulière dans SetEnvIf.

-12voto

Ben C. Forsberg Points 737

La réponse semble être d'utiliser l'en-tête plusieurs fois. C'est-à-dire, au lieu d'envoyer

Access-Control-Allow-Origin: http://domain1.example, http://domain2.example, http://domain3.example

envoyez

Access-Control-Allow-Origin: http://domain1.example
Access-Control-Allow-Origin: http://domain2.example
Access-Control-Allow-Origin: http://domain3.example

Sur Apache, vous pouvez le faire dans une section du fichier httpd.conf ou dans le fichier .htaccess en utilisant mod_headers et cette syntaxe :

Header add Access-Control-Allow-Origin "http://domain1.example"
Header add Access-Control-Allow-Origin "http://domain2.example"
Header add Access-Control-Allow-Origin "http://domain3.example"

Le truc est d'utiliser add plutôt que append comme premier argument.

0 votes

Le truc semble prometteur, mais cela ne fonctionne pas dans FF 3.6.13. Ce que j'observe, c'est que deux en-têtes avec le même nom sont regroupés en un seul, avec des valeurs séparées par une virgule - et cela ne fonctionne pas, comme l'a posté l'OP. J'ai observé les en-têtes dans LiveHTTPHeaders et FireBug.

1 votes

Voir, quand je l'ai fait, j'ai fait "Header set ..." plutôt que "Header add ..." - semble fonctionner pour moi. Firefox 3.6.16

0 votes

Cela n'est pas autorisé et ne fonctionne pas dans FF - bugzilla.mozilla.org/show_bug.cgi?id=671608

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X