Existe-t-il un moyen d'autoriser plusieurs domaines croisés à l'aide de l'en- Access-Control-Allow-Origin
tête?
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 il ne semble pas fonctionner dans Firefox.
Est-il possible de spécifier plusieurs domaines ou suis-je coincé avec un seul?
.htaccess
http
cors
xmlhttprequest
cross-domain
Thomas J Bradley
la source
la source
Access-Control-Allow-Origin
tête nesignifie pas que d'autres domaines ne peuvent pas déclencher une méthode sur ce noeud final (par exemple la méthode API REST). Cela signifie simplement que les origines non autorisées ne peuvent pas utiliser le résultat en javascript (le navigateur le garantit). Pour restreindre l'accès à un point de terminaison pour des domaines spécifiques, utilisez un filtre de requête côté serveur qui, par exemple, renvoie HTTP 401 pour les domaines non autorisés.Vary: Origin
tête lorsque vous souhaitez utiliser plusieurs URL, voir: fetch.spec.whatwg.org/#cors-protocol-and-http-cachesRéponses:
Cela ressemble à la façon recommandée de le faire est de demander à votre serveur de lire l'en-tête Origin du client, de le comparer à la liste des domaines que vous souhaitez autoriser, et s'il correspond, de
Origin
renvoyer la valeur de l'en- tête au client sous la forme l'en-Access-Control-Allow-Origin
tête dans la réponse.Avec
.htaccess
vous pouvez le faire comme ceci:la source
Une autre solution que j'utilise en PHP:
la source
header('Access-Control-Allow-Origin: *')
parfois dit ne peut pas utiliser de joker si le drapeau des informations d'identification est vrai - se produit quandheader('Access-Control-Allow-Credentials: true')
probablement. Donc, mieux vaut Allow-Origin le$http_origin
lui-même si les conditions sont rempliesheader("Access-Control-Allow-Origin: " . $http_origin);
pour le faire fonctionnerCela a fonctionné pour moi:
Une fois installé
.htaccess
, cela fonctionnera à coup sûr.la source
Header set Access-Control-Allow-Credentials true
pour que cela fonctionne comme la réponse de @GeorgeReferer
au lieu deOrigin
. Utilisation deReferer
Works, mais le problème est qu'il redéfinit l'URL complète surAccess-Control-Allow-Origin
Je veux couper le nom de domaineReferer
et l'attribuerAccess-Control-Allow-Origin
. Quelque chose comme le résultat de cetteecho http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
commande - dans bash. Est-il possible de faire de même dans le fichier conf (apache)? Une idée?J'ai eu le même problème avec les polices woff, plusieurs sous-domaines devaient y avoir accès. Pour autoriser les sous-domaines, j'ai ajouté quelque chose comme ça à mon httpd.conf:
Pour plusieurs domaines, vous pouvez simplement modifier l'expression régulière dans
SetEnvIf
.la source
(.*\.?example\.org)
pourexample.com
etsub.example.com
.subexample.com
. Vous devriez le changer en:((.*\.)?example\.org)
Voici comment renvoyer l'en-tête Origin s'il correspond à votre domaine avec Nginx, cela est utile si vous souhaitez servir une police à plusieurs sous-domaines:
la source
.
dans example.org est interprété comme une valeur car il s'agit d'une expression régulière? Dans ce cas, cela autoriserait-il par erreur un TLD d'exemple-org personnalisé?"^example\.org$"
parce que vous devez vous assurer qu'un pirate ne peut pas passer à travers votre regex avecsubdomainexample.org
(utiliser^
) ouexample.orgevil
(utiliser$
) ouexamplezorg
(échapper\.
)Voici ce que j'ai fait pour une application PHP demandée par AJAX
Si l'origine de la demande est autorisée par mon serveur, retournez le
$http_origin
lui - même comme valeur de l'en-Access-Control-Allow-Origin
tête au lieu de renvoyer un*
caractère générique.la source
Il y a un inconvénient dont vous devez être conscient: dès que vous externalisez des fichiers vers un CDN (ou tout autre serveur qui n'autorise pas les scripts) ou si vos fichiers sont mis en cache sur un proxy, la modification de la réponse en fonction de 'Origin' l'en-tête de la demande ne fonctionnera pas.
la source
Vary: Origin
n'est pas pris en charge par Akamai , l'un des plus grands CDN sur le marché ... Plus de détails disponibles ici égalementPour plusieurs domaines, dans votre
.htaccess
:la source
Header set Vary Origin
serait un bon ajout à cette réponse.AccessControlAllowOrigin=$0$1
àAccessControlAllowOrigin=$0
. Sinon, cela n'a pas fonctionné pour les origines HTTPS.http://example.com
est sorti correctement, maishttps://example.com
est sorti commehttps://example.coms
, avec un suppléments
à la fin.Pour que les utilisateurs de Nginx autorisent CORS pour plusieurs domaines. J'aime l'exemple de @ marshall bien que ses réponses ne correspondent qu'à un seul domaine. Pour faire correspondre une liste de domaines et de sous-domaines, cette expression régulière facilite le travail avec les polices:
Cela ne fera écho qu'aux en-têtes "Access-Control-Allow-Origin" qui correspondent à la liste de domaines donnée.
la source
Pour IIS 7.5+ avec le module URL Rewrite 2.0 installé, veuillez consulter cette réponse SO
la source
Voici une solution pour l'application Web Java, basée sur la réponse de yesthatguy.
J'utilise Jersey REST 1.x
Configurez le web.xml pour connaître Jersey REST et CORSResponseFilter
Voici le code de CORSResponseFilter
la source
Comme mentionné ci-dessus,
Access-Control-Allow-Origin
doit être unique etVary
doit être défini surOrigin
si vous êtes derrière un CDN (Content Delivery Network).Partie pertinente de ma configuration Nginx:
la source
set $cors
une sorte de sens caché, ou est-ce juste spécifique à votre conifg? il semble qu'il puisse être omis avec le secondif
Peut-être que je me trompe, mais autant que je puisse voir
Access-Control-Allow-Origin
a un"origin-list"
paramètre as.Par définition, an
origin-list
est:Et d'après cela, je soutiens que différentes origines sont admises et devraient être séparées par des espaces .
la source
5.1 Access-Control-Allow-Origin Response Header
indique que la liste d'origine est contrainte: Plutôt que d'autoriser une liste d'origine séparée par des espaces, il s'agit soit d'une seule origine, soit de la chaîne "null".Pour les applications ExpressJS, vous pouvez utiliser:
la source
J'ai eu du mal à configurer cela pour un domaine exécutant HTTPS, alors j'ai pensé que je partagerais la solution. J'ai utilisé la directive suivante dans mon fichier httpd.conf :
Changez
example.com
pour votre nom de domaine. Ajoutez-le à l'intérieur<VirtualHost x.x.x.x:xx>
de votre fichier httpd.conf . Notez que si vous avezVirtualHost
un suffixe de port (par exemple:80
), cette directive ne s'appliquera pas à HTTPS, vous devrez donc également aller dans / etc / apache2 / sites-available / default-ssl et ajouter la même directive dans ce fichier, à l'intérieur du<VirtualHost _default_:443>
section.Une fois les fichiers de configuration mis à jour, vous devrez exécuter les commandes suivantes dans le terminal:
la source
^http(s)?://(.+\.)?example\.com(:\d+)?$
Si vous rencontrez des problèmes avec les polices, utilisez:
la source
Une approche plus flexible consiste à utiliser les expressions d'Apache 2.4. Vous pouvez faire correspondre des domaines, des chemins et à peu près toutes les autres variables de demande. Bien que la réponse envoyée soit toujours
*
, les seuls demandeurs qui la reçoivent sont de toute façon ceux qui répondent aux exigences. L'utilisation de l'Origin
en-tête de demande (ou de tout autre) dans l'expression entraîne la fusion automatique d'Apache dans l'en-Vary
tête de réponse, afin que la réponse ne soit pas réutilisée pour une origine différente.la source
*
informations d'identification comme la connexion. Il sera donc préférable de passer le nom d'hôte correspondant au lieu de*
.Access-Control-Allow-Origin
tête pour laOPTIONS
demande de contrôle en amont qui vérifie les en-têtes pour voir si le serveur autorise cette origine. Je l'ai réparé. Ce*
n'était donc pas le vrai problème pour moi. Mais, certains navigateurs n'acceptent toujours pas les*
informations d'identification, donc lorsqu'une application Web envoie une demande d'origine croisée, ils DOIVENT spécifier un en-HTTP_ORIGIN
tête auquel vous pourriez accéder dynamiquement avec une variableOrigin
dans.htaccess
Apache ou$_SERVER['HTTP_ORIGIN'];
PHP. Quoi qu'il en soit, votre solution est bonne car elle autorise toutes les origines, mais moins sécurisée*
permet tout. 2) HOST est différent de ORIGIN. HOST est le «TARGET HOST» qui est transmis à l'en-tête de la demande. Mais ORIGIN est celuiINITIAL HOST
qui envoie la demande auTARGET HOST
. Par conséquent, dans votre code,ORIGIN HOST
est ignoré et n'est jamais utilisé. Voir les réponses ci-dessus et vous verrez comment ils utilisent desORIGIN
valeurs pour les ajouterAccess-Control-Allow-Origin
.*
pas tout le monde car l'utilisation de l'en-Origin
tête de demande dans l'expression fait que Apache le fusionne automatiquement dans l'en-Vary
tête de réponse, sauf si l'on utilisereq_novary('Origin')
(probablement indésirable). Les navigateurs savent qu'ils peuvent obtenir une réponse différente pour un autreOrigin
et si la valeur envoyée ne réussit pas son test, l'en-Access-Control-Allow-Origin
tête n'est jamais défini.Code PHP:
la source
HTTP_ORIGIN n'est pas utilisé par tous les navigateurs. HTTP_ORIGIN est-il sécurisé? Pour moi ça revient vide en FF.
J'ai les sites auxquels j'autorise l'accès à mon site envoyer un ID de site, je vérifie ensuite ma base de données pour l'enregistrement avec cet ID et obtenir la valeur de la colonne SITE_URL (www.votresite.com).
Même si l'envoi via un ID de site valide, la demande doit provenir du domaine répertorié dans ma base de données associé à cet ID de site.
la source
Voici une option étendue pour apache qui inclut certaines des définitions de police les plus récentes et prévues:
la source
Pour faciliter l'accès à plusieurs domaines pour un service ASMX, j'ai créé cette fonction dans le fichier global.asax:
Cela permet
OPTIONS
également la gestion CORS du verbe.la source
Exemple de code PHP pour faire correspondre les sous-domaines.
la source
Pour un copier / coller assez facile pour les applications .NET, j'ai écrit ceci pour activer CORS à partir d'un
global.asax
fichier. Ce code suit les conseils donnés dans la réponse actuellement acceptée, reflétant toute origine renvoyée dans la demande dans la réponse. Cela permet effectivement d'atteindre «*» sans l'utiliser.La raison en est qu'il permet plusieurs autres fonctionnalités CORS , y compris la possibilité d'envoyer un AJAX XMLHttpRequest avec l'attribut 'withCredentials' défini sur 'true'.
la source
Et une autre réponse dans Django. Pour qu'une vue unique autorise CORS à partir de plusieurs domaines, voici mon code:
la source
Passerelle AWS Lambda / API
Pour plus d'informations sur la configuration de plusieurs origines sur AWS Lambda sans serveur et la passerelle API - bien qu'une solution assez importante pour quelque chose que vous ressentez devrait être assez simple - voir ici:
https://stackoverflow.com/a/41708323/1624933
Il n'est actuellement pas possible de configurer plusieurs origines dans API Gateway, voir ici: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html ), mais la recommandation (dans la réponse ci-dessus) est:
La solution simple est évidemment d'activer TOUS (*) comme ceci:
Mais il pourrait être préférable de le faire du côté de la passerelle API (voir le deuxième lien ci-dessus).
la source
Access-Control-Allow-Credentials: true
n'est pas autorisé avec un caractère génériqueAccess-Control-Allow-Origin: *
. Définissez un spécifique à la<origin>
place.La réponse du support de Google sur la diffusion d'annonces via SSL et la grammaire du RFC lui - même semblent indiquer que vous pouvez délimiter les URL. Je ne sais pas à quel point cela est bien pris en charge dans différents navigateurs.
la source
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Si vous essayez autant d'exemples de code comme moi pour le faire fonctionner en utilisant CORS, il convient de mentionner que vous devez d'abord vider votre cache pour essayer s'il fonctionne réellement, semblable à des problèmes comme lorsque de vieilles images sont toujours présentes, même si c'est supprimé sur le serveur (car il est toujours enregistré dans votre cache).
Par exemple CTRL + SHIFT + DELdans Google Chrome pour supprimer votre cache.
Cela m'a aidé à utiliser ce code après avoir essayé de nombreuses
.htaccess
solutions pures et cela semblait le seul qui fonctionnait (au moins pour moi):Notez également qu'il est largement répandu que de nombreuses solutions disent que vous devez taper,
Header set ...
mais c'est le casHeader add ...
. J'espère que cela aide quelqu'un qui a les mêmes problèmes depuis quelques heures comme moi.la source
La réponse ci-dessous est spécifique à C #, mais le concept devrait être applicable à toutes les différentes plates-formes.
Pour autoriser les demandes d'origine croisée à partir d'une API Web, vous devez autoriser les demandes d'options à votre application et ajouter une annotation ci-dessous au niveau du contrôleur.
[EnableCors (UrlString, Header, Method)] Désormais, les origines ne peuvent être transmises que sous forme de chaîne. SO si vous souhaitez transmettre plusieurs URL dans la demande, transmettez-la en tant que valeur séparée par des virgules.
UrlString = " https: //a.hello.com,https: //b.hello.com "
la source
Une seule origine peut être spécifiée pour l'en-tête Access-Control-Allow-Origin. Mais vous pouvez définir l'origine dans votre réponse en fonction de la demande. N'oubliez pas non plus de définir l'en-tête Vary. En PHP, je ferais ce qui suit:
la source
Nous pouvons également définir cela dans le fichier Global.asax pour l'application Asp.net.
la source