Sur la base de la réponse de DaveRandom , je jouais également et j'ai trouvé une solution Apache légèrement plus simple qui produit le même résultat ( Access-Control-Allow-Origin
est définie dynamiquement sur le protocole + domaine + port spécifique actuel) sans utiliser de règles de réécriture:
SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN
Header merge Vary "Origin"
Et c'est tout.
Ceux qui souhaitent activer CORS sur le domaine parent (par exemple mywebsite.com) en plus de tous ses sous-domaines peuvent simplement remplacer l'expression régulière de la première ligne par celle-ci:
^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$
.
Remarque: pour la conformité aux spécifications et un comportement de mise en cache correct, TOUJOURS ajouter l'en- Vary: Origin
tête de réponse pour les ressources compatibles CORS, même pour les demandes non CORS et celles provenant d'une origine non autorisée (voir exemple pourquoi ).
//
dans ce contexte, car la configuration Apache n'utilise pas d'expressions régulières délimitées par des barres obliques . Regexr se plaint parce que, dans ce contexte, les barres obliques ont une signification particulière en tant que délimiteurs.The 'Access-Control-Allow-Origin' header contains multiple values '^(https?://(?:.+.)?aerofotea.com(?::d{1,5})?)$', but only one is allowed. Origin 'http://local.aerofotea.com' is therefore not allowed access.
La spécification CORS est tout ou rien. Il ne supporte que
*
,null
ou le protocole exact + domaine + port: http://www.w3.org/TR/cors/#access-control-allow-origin-response-headerVotre serveur devra valider l'en-tête d'origine à l'aide de l'expression régulière, puis vous pourrez faire écho à la valeur d'origine dans l'en-tête de réponse Access-Control-Allow-Origin.
la source
EDIT : Utilisez la solution de @ Noyo au lieu de celle-ci. C'est plus simple, plus clair et probablement beaucoup plus performant sous charge.
RÉPONSE ORIGINALE GAUCHE ICI À DES FINS HISTORIQUES UNIQUEMENT !!
J'ai joué un peu avec ce problème et j'ai trouvé cette solution réutilisable .htaccess (ou httpd.conf) qui fonctionne avec Apache:
Définissez simplement la
ACCESS_CONTROL_ROOT
variable en haut du bloc sur votre domaine racine et elle fera écho de laOrigin:
valeur d'en-tête de la demande au client dans laAccess-Control-Allow-Origin:
valeur d'en-tête de réponse si elle correspond à votre domaine.Notez également que vous pouvez utiliser en
sub.mydomain.com
tant queACCESS_CONTROL_ROOT
et cela limitera les origines àsub.mydomain.com
et*.sub.mydomain.com
(c'est-à-dire qu'il ne doit pas nécessairement être la racine du domaine). Les éléments autorisés à varier (protocole, port) peuvent être contrôlés en modifiant la partie de correspondance URI de l'expression régulière.la source
Je réponds à cette question, car la réponse acceptée ne peut pas suivre
Par exemple: il n'enverra pas d'en-têtes CORS pour http://mywebsite.com alors qu'il fonctionne pour http://somedomain.mywebsite.com/
Pour activer votre site, il vous suffit de mettre votre site à la place de "mywebsite.com" dans la configuration Apache ci-dessus.
Pour autoriser plusieurs sites:
Test après le déploiement:
La réponse curl suivante doit avoir l'en-tête "Access-Control-Allow-Origin" après la modification.
la source
J'avais besoin d'une solution PHP uniquement, donc juste au cas où quelqu'un en aurait également besoin. Il prend une chaîne d'entrée autorisée comme "* .example.com" et renvoie le nom du serveur d'en-tête de demande, si l'entrée correspond.
Et voici les cas de test pour un fournisseur de données phpunit:
la source
preg_quote()
parce que c'est la bonne façon de le faire (même si.
le seul méta-caractère regexp valide dans un nom DNSpreg_quote()
décrit mieux l'opération prévue)none
ne s'agit pas d'une valeur sémantiquement valide pour l'en-tête (ou du moins, ne fait pas ce qu'elle implique) selon la spécification. En tant que tel,return null;
peut avoir plus de sens pour cette branche, et dans ce cas, aucun en-tête ne doit être envoyé au client, il doit donc être vérifié par l'appelant.preg_quote()
cite le signe * et ainsi,str_replace()
par exemple, laisse un "\" orphelin.Lors de la configuration
Access-Control-Allow-Origin
en .htaccess, seuls les éléments suivants ont fonctionné:J'ai essayé plusieurs autres mots - clés suggérés
Header append
,Header set
, aucun travaillé comme suggéré dans de nombreuses réponses sur le SO, bien que je ne sais pas si ces mots - clés sont obsolètes ou non valables pour nginx .Voici ma solution complète:
la source
Nous avions des problèmes similaires avec Font Awesome sur un domaine statique "sans cookie" lors de la lecture des polices du "domaine des cookies" (www.domain.tld) et ce message était notre héros. Voir ici: Comment puis-je résoudre le problème de police Web «En-tête de réponse CORS (Missing Cross-Origin Resource Sharing) manquant»?
Pour les types copier / coller-r (et pour donner quelques accessoires), j'ai reconstitué cela à partir de toutes les contributions et l'ai ajouté en haut du fichier .htaccess de la racine du site:
Super sécurisé, super élégant. J'adore: vous n'avez pas à ouvrir la bande passante de vos serveurs aux voleurs de ressources / types de liens directs.
Props à: @Noyo @DaveRandom @ pratap-koritala
(J'ai essayé de laisser cela comme un commentaire à la réponse acceptée, mais je ne peux pas encore le faire)
la source
Pour Spring Boot, j'ai trouvé cela
RegexCorsConfiguration
qui étend l'officielCorsConfiguration
: https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.javala source
Il semble que la réponse d'origine soit antérieure à Apache 2.4. Ça n'a pas marché pour moi. Voici ce que j'ai dû changer pour le faire fonctionner en 2.4. Cela fonctionnera pour n'importe quelle profondeur de sous-domaine de yourcompany.com .
la source
J'ai dû modifier un peu la réponse de Lars , car un orphelin
\
s'est retrouvé dans l'expression régulière, pour ne comparer que l'hôte réel (sans prêter attention au protocole ou au port) et je voulais prendre en charge unlocalhost
domaine en plus de mon domaine de production. J'ai donc changé le$allowed
paramètre pour être un tableau.Utilisation comme suit:
la source
dans mon cas en utilisant angulaire
dans mon intercepteur HTTP, je mets
dans l'en-tête de la demande
la source