Question Domaines d'origines multiples Access-Control-Allow-Origin?


Y at-il un moyen d'autoriser plusieurs domaines croisés en utilisant le Access-Control-Allow-Origin entête?

Je suis au courant de *mais c'est trop ouvert. Je veux vraiment autoriser juste quelques domaines.

À titre d'exemple, quelque chose comme ceci:

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

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

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


837
2017-10-31 03:27


origine


Réponses:


On a l'impression que la méthode recommandée consiste à demander à 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, de faire écho à la valeur du Origin retourner au client comme le Access-Control-Allow-Origin en-tête dans la réponse.

Avec .htaccess vous pouvez le faire comme ceci:

# ----------------------------------------------------------------------
# Allow loading of external fonts
# ----------------------------------------------------------------------
<FilesMatch "\.(ttf|otf|eot|woff)$">
    <IfModule mod_headers.c>
        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
    </IfModule>
</FilesMatch>

724
2017-12-05 00:10



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");
}

165
2017-09-17 10:49



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

Quand mis en .htaccess, ça marchera à coup sûr.


98
2018-06-18 06:31



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

SetEnvIf Origin "^(.*\.example\.com)$" ORIGIN_SUB_DOMAIN=$1
<FilesMatch "\.woff$">
    Header set Access-Control-Allow-Origin "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
</FilesMatch>

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


84
2018-05-18 12:46



Voici comment faire écho à l'en-tête Origin si celui-ci correspond à votre domaine avec Nginx, ceci est utile si vous voulez servir une police de plusieurs sous-domaines:

location /fonts {
    # this will echo back the origin header
    if ($http_origin ~ "example.org$") {
        add_header "Access-Control-Allow-Origin" $http_origin;
    }
}

55
2017-09-13 20:25



Voici ce que j'ai fait pour une application PHP qui est demandée par AJAX

$request_headers        = apache_request_headers();
$http_origin            = $request_headers['Origin'];
$allowed_http_origins   = array(
                            "http://myDumbDomain.example"   ,
                            "http://anotherDumbDomain.example"  ,
                            "http://localhost"  ,
                          );
if (in_array($http_origin, $allowed_http_origins)){  
    @header("Access-Control-Allow-Origin: " . $http_origin);
}

Si l'origine de la demande est autorisée par mon serveur, renvoyez le $http_origin lui-même en tant que valeur de la Access-Control-Allow-Origin en-tête au lieu de retourner un * wildcard.


22
2017-12-25 21:48



Il y a un désavantage dont vous devez être conscient: dès que vous avez externalisé des fichiers sur un CDN (ou tout autre serveur qui ne permet pas de script) ou si vos fichiers sont mis en cache sur un proxy, modifier la réponse basée sur 'Origin' L'en-tête de demande ne fonctionnera pas.


18
2018-02-20 19:18



Pour plusieurs domaines, dans votre .htaccess:

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(domain1.example|domain2.example)$" AccessControlAllowOrigin=$0$1
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header set Access-Control-Allow-Credentials true
</IfModule>

16
2018-03-11 16:51



Pour IIS 7.5+ avec le module URL Rewrite 2.0 installé s'il vous plaît voir cette réponse SO


14
2018-06-27 01:57