Access-Control-Allow-Origin Plusieurs Domaines D'Origine?
Est-il un moyen pour permettre à de multiples inter-domaines à l'aide de la Access-Control-Allow-Origin
- tête?
Je suis conscient de la *
, mais c'est trop ouvert. J'ai vraiment envie de donner juste un couple de domaines.
Comme un 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 seulement un seul?
- Plutôt que de laisser un espace séparé de la liste d'origine (origine de la liste ou nulle) est soit une origine unique ou de la chaîne de la valeur "null". (merci @maxpolk)
- En utilisant la plus récente de Firefox, ni la séparation par virgule, ni les séparant par des espaces domaines a fait un travail. Correspondant à une liste de domaines et de mettre un seul hôte dans les en-têtes est toujours mieux de sécurité et ne fonctionne correctement.
- Si vous êtes aux prises avec ce pour HTTPS, j'ai trouvé un solution.
- ou "*" ?
shared based by returning the value of the Origin request header, "*", or "null"
- remarque importante: en autorisant uniquement les cretain les domaines de la
Access-Control-Allow-Origin
en-tête n' pas, les autres domaines ne peuvent pas déclencher une méthode sur ce critère (par exemple, RESTE la méthode API). Cela signifie simplement que la refusé origines ne peut pas utiliser le résultat en javascript (navigateur assure que c'). Pour restreindre l'accès à un point de terminaison pour des domaines spécifiques d'utilisation d'un serveur-côté filtre de requête, par exemple, renvoie HTTP 401 pour les interdits domaines. - Vous devriez toujours ajouter
Vary: Origin
en-tête lorsque vous souhaitez utiliser plusieurs Url, voir: fetch.spec.whatwg.org/#cors-protocol-and-http-caches
Vous devez vous connecter pour publier un commentaire.
Sons comme le recommande façon de le faire est d'avoir votre serveur de lire l'en-tête d'Origine de la part du client, de la comparer à la liste des domaines que vous souhaitez autoriser, et si elle correspond, en écho de la valeur de la
Origin
- tête en arrière pour le client comme leAccess-Control-Allow-Origin
tête dans la réponse.Avec
.htaccess
vous pouvez le faire comme ceci:Header always set
a fonctionné pour moi.Header append Vary Origin
Origin
en-tête d'une requête Ajax, le navigateur va vous donner une erreur de ce type: "a Refusé d'dangereuses en-tête "Origine"".e
après %{AccessControlAllowOrigin}e
une faute de frappe? aucunSetEnvIf
paramètre manque de s'échapper des points, c'est à diregoogle.com
devrait êtregoogle\.com
, sinon domaines commegoogleFcom
seront également permis...Une autre solution, je suis à l'aide de PHP:
header('Access-Control-Allow-Origin: *')
dit parfois ne peut pas utiliser de joker si les informations d'identification indicateur est vrai - se produit lorsqueheader('Access-Control-Allow-Credentials: true')
probablement. Donc, c'est mieux pour Permettre à l'Origine de la$http_origin
lui-même si les conditions sont rempliesheader("Access-Control-Allow-Origin: " . $http_origin);
pour le faire fonctionnerVary: Origin
en-tête. voir: fetch.spec.whatwg.org/#cors-protocol-and-http-cachesCela a fonctionné pour moi:
Lorsqu'il est mis en
.htaccess
, il va travailler pour vous.Header set Access-Control-Allow-Credentials true
pour que cela fonctionne comme @George 's réponseReferer
au lieu deOrigin
. À l'aide deReferer
fonctionne, mais le problème est qu'il définit l'URL complète de retour àAccess-Control-Allow-Origin
je veux le nom de domaine deReferer
et de l'attribuer àAccess-Control-Allow-Origin
. Quelque chose comme le résultat de cette -echo http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
de commande bash . Est-ce possible de faire la même chose dans l' (apache)fichier conf? Une Idée?localhost
.J'ai eu le même problème avec woff-polices de caractères, de plusieurs sous-domaines devaient avoir accès. Pour permettre aux sous-domaines, j'ai ajouté quelque chose comme cela pour mon httpd.conf:
Pour de multiples domaines, vous pouvez simplement modifier la regex dans
SetEnvIf
.(.*\.?example\.org)
pourexample.com
etsub.example.com
.subexample.com
. Vous devez modifier:((.*\.)?example\.org)
Voici comment faire l'écho de l'en-tête d'Origine si elle correspond à votre nom de domaine avec Nginx, c'est utile si vous souhaitez répondre à une police de plusieurs sous-domaines:
.
dans example.org interprétée comme une valeur, étant donné que c'est une expression régulière? Dans ce cas, serait-ce à tort de permettre à un exemple personnalisé-org TLD?"^example\.org$"
parce que vous avez besoin pour s'assurer qu'un hacker ne peut pas passer à travers votre regex avecsubdomainexample.org
(utiliser^
) ouexample.orgevil
(utiliser$
) ouexamplezorg
(escape\.
)"\.?example\.org$"
-- nous ne voulons pas d'ancrage sur le début de la chaîne parce que ce serait empêcher valide les sous-domaines de l'appariement de la première place. Si le client demande l'apex (sans aucun sous-domaine partie) nous voulons que le match de trop.Voici ce que j'ai fait pour une application en PHP qui est demandé par AJAX
Si le requérant origine est autorisé par mon serveur, le retour de la
$http_origin
lui-même en tant que valeur de laAccess-Control-Allow-Origin
en-tête au lieu de retourner un*
générique.Il y a un inconvénient, vous devez être conscient: dès Que vous les fichiers source dans un CDN (ou tout autre serveur qui ne permet pas de script) ou si vos fichiers sont mis en cache sur un proxy, la modification de la réponse basée sur "l'Origine" en-tête de requête ne fonctionnera pas.
Vary: Origin
n'est pas pris en charge par Akamai, l'un des plus grands CA existe... Plus les détails sont disponibles iciPour plusieurs domaines, dans votre
.htaccess
:Header set Vary Origin
serait une belle addition à cette réponse.AccessControlAllowOrigin=$0$1
àAccessControlAllowOrigin=$0
. Sinon, il n'a pas de travail pour HTTPS origines.http://example.com
est sorti correctement, maishttps://example.com
est sorti commehttps://example.coms
, avec un supplément des
sur la fin.Pour Nginx les utilisateurs pour permettre à la SCRO pour plusieurs domaines. J'aime l' @marshall exemple, bien que sa anwers seulement correspond à un domaine. Pour correspondre à une liste de domaine et sous-domaine cette regex faire de la facilité à travailler avec des polices:
Cela ne echo "Access-Control-Allow-Origin" en-têtes qui correspond à la liste des domaines.
Pour IIS 7.5+ avec Réécriture d'URL 2.0 module installé, veuillez voir cette SORTE de réponse
Voici une solution pour Java web app, en fonction de la réponse de yesthatguy.
Je suis en utilisant Maillot de REPOS 1.x
Configurer l'web.xml pour être au courant de Maillot de REPOS et de la CORSResponseFilter
Voici le code pour CORSResponseFilter
Comme mentionné ci-dessus,
Access-Control-Allow-Origin
doit être unique etVary
doit être réglé àOrigin
si vous êtes derrière un CDN (Content delivery Network).Partie de mon Nginx configuration:
set $cors
une sorte de sens caché, ou est-il spécifique à votre conifg? il semble qu'il peut être omis, ainsi que la deuxièmeif
Peut-être que je me trompe, mais pour autant que je peux voir
Access-Control-Allow-Origin
a un"origin-list"
comme paramètre.Par définition un
origin-list
est:Et à partir de cela, je soutiens origines différentes sont admis et doivent être séparés par un espace.
5.1 Access-Control-Allow-Origin Response Header
unis que l'origine de la liste est limitée: Plutôt que de laisser un espace-liste séparée par des origines, c'est soit une origine unique ou de la chaîne de la valeur "null".J'ai eu du mal à le définir pour un domaine exécutant le protocole HTTPS, alors j'ai pensé que je voudrais partager la solution. J'ai utilisé la directive suivante dans mon httpd.conf fichier:
Changement
example.com
à votre nom de domaine. Ajoutez ceci à l'intérieur<VirtualHost x.x.x.x:xx>
dans votre httpd.conf fichier. Notez que si votreVirtualHost
a un port suffixe (par exemple:80
), alors cette directive ne s'appliquera pas en HTTPS, donc il vous faudra aussi aller à /etc/apache2/sites-available/default-ssl et ajouter la même directive dans ce fichier, à l'intérieur de la<VirtualHost _default_:443>
section.Une fois les fichiers de configuration sont mis à jour, vous devez exécuter les commandes suivantes dans le terminal:
^http(s)?://(.+\.)?example\.com(:\d+)?$
Si vous rencontrez des problèmes avec les polices, utilisez:
Pour ExpressJS applications que vous pouvez utiliser:
HTTP_ORIGIN n'est pas utilisé par tous les navigateurs. Comment sécuriser HTTP_ORIGIN? Pour moi il s'agit vide en FF.
J'ai des sites que j'permettre l'accès à mon site envoyer sur un ID de site, je vérifie ma DB pour l'enregistrement avec cet id et obtenir SITE_URL valeur de la colonne (www.yoursite.com).
Même si les envoyer sur un site valide ID de la requête doit être du domaine figurant dans ma DB associé à ce site ID.
Voici une option d'étendue pour apache qui comprend quelques-uns des plus récents et prévus police définitions:
Pour faciliter multiples accès de domaine pour un ASMX service, j'ai créé cette fonction dans le monde.asax fichier:
Cela permet de la SCRO manipulation de
OPTIONS
verbe aussi.PHP exemple de code pour la mise en correspondance des sous-domaines.
Assez facile de copier /coller pour .NET applications, j'ai écrit ceci pour permettre la SCRO à partir de l'intérieur d'un
global.asax
fichier. Ce code suit les conseils donnés dans les actuellement accepté de répondre, reflétant la dos d'origine est donnée dans la demande dans la réponse. Ce bien un '*' sans l'utiliser.La raison pour cela est qu'il permet à plusieurs autres caractéristiques de la SCRO, y compris la possibilité d'envoyer une requête AJAX XMLHttpRequest avec le "withCredentials' attribut de la valeur "true".
Une approche plus souple est d'utiliser Apache 2.4 expressions. Vous pouvez le match contre les domaines, les chemins, et juste au sujet de chaque d'autres demande variable. Si la réponse envoyée est toujours
*
, la seule demandeurs recevoir sont ceux qui répondent aux exigences de toute façon. À l'aide de laOrigin
(ou autre) en-tête de requête dans l'expression, Apache fusionner automatiquement dans leVary
en-tête de réponse, de sorte que la réponse ne sera pas réutilisé pour une origine différente.*
avec les informations d'identification comme Login. Ainsi, il sera mieux si vous passez à la correspondance nom d'hôte au lieu de*
.Access-Control-Allow-Origin
- tête pourOPTIONS
de contrôle en amont demander que des contrôles pour les en-têtes pour voir si le serveur permet à cette origine. Je me suis fixé. Donc*
n'était pas le vrai problème pour moi. Mais, là encore, certains navigateurs n'acceptent pas*
avec des informations d'identification, donc lors d'une Web App est l'envoi de la Croix-Origine de la demande, ils doivent spécifierHTTP_ORIGIN
en-tête auquel vous pouvez accéder de façon dynamique avec la variableOrigin
dans.htaccess
pour Apache, ou$_SERVER['HTTP_ORIGIN'];
en PHP. De toute façon, votre solution est la bonne, alors qu'elle permet à toutes les origines, mais moins sécurisé*
permet tout. 2) l'ACCUEIL est différent de l'ORIGINE. L'HÔTE est l'HÔTE CIBLE` qui est passé à la tête de la demande. Mais l'ORIGINE est laINITIAL HOST
qui envoyer la demande à laTARGET 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 utilisentORIGIN
valeurs à ajouter dansAccess-Control-Allow-Origin
.Origin
en-tête de requête dans l'expression, Apache fusionner automatiquement dans leVary
en-tête de réponse, sauf si on utilisereq_novary('Origin')
(probablement indésirables). Les navigateurs savent qu'ils peuvent obtenir une réponse différente pour un autreOrigin
et si la valeur envoyée ne passe pas un test, leAccess-Control-Allow-Origin
en-tête n'est jamais réglé.Et une réponse de plus en Django. Pour avoir une vue unique de permettre la SCRO à partir de plusieurs domaines, voici mon code:
De Google de soutien de réponse sur la diffusion d'annonces sur SSL et la la grammaire dans la RFC lui-même semblerait indiquer que vous pouvez délimiter l'espace de l'Url. Pas sûr de savoir comment bien pris en charge c'est dans les différents navigateurs.
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Si vous essayez donc de nombreux exemples de code comme moi pour le faire fonctionner à l'aide de la SCRO, il vaut la peine de mentionner que vous avez à effacer votre cache d'abord à essayer si cela fonctionne réellement, semblables à des questions comme quand les vieilles images sont toujours présents, même si il est supprimé sur le serveur (parce que c'est toujours enregistrées dans la mémoire cache).
Par exemple CTRL + MAJ + SUPPR dans Google Chrome pour supprimer le cache.
Cela m'a aidé à l'aide de ce code après avoir essayé de nombreux pure
.htaccess
solutions et cela semble être le seul à travailler (au moins pour moi):Notez également qu'il est largement répandue que de nombreuses solutions dites que vous avez ce type de
Header set ...
mais il estHeader add ...
. Espérons que cela aide quelqu'un ayant les mêmes problèmes depuis quelques heures maintenant, comme moi.- Dessous de la réponse est spécifique à C#, mais le concept devrait être applicable à toutes les plates-formes différentes.
Pour permettre l'Origine de la Croix-Requêtes à partir d'une api web, Vous devez l'Option autoriser les demandes de votre Application et Ajouter annotation ci-dessous au niveau du contrôleur.
[EnableCors(UrlString,L'En-Tête De La Méthode)]
Maintenant, les origines peuvent être passées uniquement une chaîne. DONC, si vous voulez passer plus d'une URL dans la demande de laissez-passer comme une séparation par virgule de la valeur.
UrlString = "https://a.hello.com,https://b.hello.com"
Une seule origine peut être spécifié pour l'Access-Control-Allow-Origin-tête. Mais vous pouvez en définir l'origine dans votre réponse en fonction de la demande. Aussi n'oubliez pas de définir l'en-tête Vary. En PHP, je voudrais faire ce qui suit:
Nous pouvons également définir ce Mondial.asax fichier pour Asp.net application.
La réponse semble être d'utiliser l'en-tête plus d'une fois. C'est, plutôt que d'envoyer
envoyer
Sur Apache, vous pouvez le faire dans une
httpd.conf
<VirtualHost>
section ou.htaccess
fichier à l'aide demod_headers
et cette syntaxe:L'astuce est d'utiliser
add
plutôt queappend
comme premier argument.Header set
ouHeader add
?add
vsset
. Il ne fonctionne tout simplement pas.