Quelqu'un at-il réussi à ajouter Access-Control-Allow-Origin
aux en-têtes de réponse? Ce dont j'ai besoin, c'est quelque chose comme ceci:
<img src="http://360assets.s3.amazonaws.com/tours/8b16734d-336c-48c7-95c4-3a93fa023a57/1_AU_COM_180212_Areitbahn_Hahnkoplift_Bergstation.tiles/l2_f_0101.jpg" />
Cette requête doit contenir dans la réponse, en-tête, Access-Control-Allow-Origin: *
Mes paramètres CORS pour le compartiment se présentent comme suit:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Comme on pouvait s'y attendre, il n'y a pas d'en-tête de réponse Origin
.
En général, tout ce que vous avez à faire est d’ajouter «Ajouter une configuration CORS» dans les propriétés de votre compartiment.
Le <CORSConfiguration>
est livré avec des valeurs par défaut. C'est tout ce dont j'avais besoin pour résoudre votre problème. Cliquez simplement sur "Enregistrer" et réessayez pour voir si cela a fonctionné. Si ce n'est pas le cas, vous pouvez également essayer le code ci-dessous (tiré de alxrb answer) qui semble avoir fonctionné pour la plupart des utilisateurs.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Pour plus d'informations, vous pouvez lire cet article sur Modification de l'autorisation d'un godet .
Je rencontrais un problème similaire lors du chargement des polices Web. Lorsque je cliquais sur "Ajouter une configuration CORS", dans les propriétés du compartiment, ce code existait déjà:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Je viens de cliquer sur Enregistrer et cela a fonctionné, mes polices Web personnalisées se chargeaient dans IE et Firefox. Je ne suis pas un expert en la matière, j'ai juste pensé que cela pourrait vous aider.
@jordanstephens a dit cela dans un commentaire, mais il s'est en quelque sorte égaré et a été une solution vraiment facile pour moi.
J'ai simplement ajouté la méthode HEAD et cliqué sur Save (Enregistrer) et cela a commencé à fonctionner.
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod> <!-- Add this -->
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Si votre demande ne spécifie pas d'en-tête Origin
, S3 n'inclura pas les en-têtes CORS dans la réponse. Cela m’a vraiment jeté à terre parce que j’essayais toujours de boucler les fichiers pour tester la CORS, mais cela n’inclut pas Origin
.
Je sais que c'est une vieille question, mais qu'il est toujours difficile de trouver une solution.
Pour commencer, cela a fonctionné pour moi sur un projet construit avec Rails 4, Paperclip 4, CamanJS, Heroku et AWS S3.
Vous devez demander votre image en utilisant le paramètre crossorigin: "anonymous"
.
<img href="your-remote-image.jpg" crossorigin="anonymous">
Ajoutez l'URL de votre site à CORS dans AWS S3. Ici est une référence d'Amazon à ce sujet. Dans la plupart des cas, accédez à votre compartiment, puis sélectionnez "Propriétés" dans les onglets de droite, ouvrez l’onglet "Autorisations", puis cliquez sur "Modifier la configuration CORS".
À l’origine,
< AllowedOrigin>
était réglé sur*
. Il suffit de remplacer cet astérisque par votre URL et d’inclure des options telles quehttp://
ethttps://
sur des lignes séparées. Je m'attendais à ce que l'astérisque accepte "Tous", mais apparemment, nous devons être plus spécifiques que cela.
C'est comme ça que ça me ressemble.
Voir les réponses ci-dessus. (mais j'avais aussi un bug chromé)
Ne chargez pas et n'affichez pas l'image sur la page en CHROME. (si vous allez créer plus tard une nouvelle instance)
Dans mon cas, j'ai chargé des images et les ai affichées sur la page. Quand ils ont été cliqués, j'ai créé une nouvelle instance d'eux:
// there is already an html <img /> on the page, I'm creating a new one now
img = $('<img crossorigin />')[0]
img.onload = function(){
context.drawImage(img, 0, 0)
context.getImageData(0,0,w,h)
}
img.src = 'http://s3.amazonaws.com/my/image.png'; // I added arbitrary ?crossorigin to change the URL of this to fix it
Chrome avait déjà mis en cache une autre version et n'a JAMAIS essayé de récupérer la version crossorigin
(même si j'utilisais crossorigin
sur les images affichées.
Pour résoudre ce problème, j'ai ajouté ?crossorigin
à la fin de l'URL de l'image (mais vous pouvez ajouter ?blah
, il est simplement arbitraire de changer le statut du cache) lorsque je l'ai chargé pour canvas.
Je vais juste ajouter à cette réponse - ci-dessus - qui a résolu mon problème.
Pour configurer le point de distribution AWS/CloudFront afin de le rendre à l'en-tête d'origine CORS, cliquez sur l'interface d'édition du point de distribution:
Accédez à l'onglet Comportements et modifiez le comportement en remplaçant les en-têtes de liste blanche de Aucun en Liste blanche, puis assurez-vous que Origin
est ajouté à la zone de liste blanche.
Je rencontrais des problèmes similaires lors du chargement de modèles 3D à partir de S3 dans une visionneuse 3D javascript (3D HOP), mais assez étrangement uniquement avec certains types de fichiers (.nxs).
Ce qui a résolu le problème pour moi était de changer AllowedHeader
de Authorization
par défaut en *
dans la configuration CORS:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Définissez la configuration CORS dans les paramètres d'autorisations pour votre compartiment S3.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
S3 ajoute les en-têtes CORS uniquement lorsque la requête http a l'en-tête Origin
.
CloudFront n'a pas retransmet l'en-tête Origin
par défaut
Vous devez ajouter à la liste blanche Origin
l'en-tête dans les paramètres de comportement de votre distribution CloudFront.
Je l'ai corrigé en écrivant ce qui suit:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Pourquoi <AllowedHeader>*</AllowedHeader>
fonctionne et <AllowedHeader>Authorization</AllowedHeader>
pas?
J'ai essayé toutes les réponses ci-dessus et rien n'a fonctionné. En fait, nous avons besoin de 3 étapes à partir des réponses ci-dessus pour que cela fonctionne:
Comme suggéré par Flavio; ajoutez la configuration CORS sur votre compartiment:
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>
Sur l'image; mentionnez crossorigin:
<img href="abc.jpg" crossorigin="anonymous">
Utilisez-vous un CDN? Si tout fonctionne correctement, connectez-vous au serveur Origin mais PAS via CDN; cela signifie que vous devez définir certains paramètres sur votre CDN, comme accepter les en-têtes CORS. Le réglage exact dépend du CDN que vous utilisez.
fwuensche "answer" permet de créer un CDN; Ce faisant, j'ai supprimé MaxAgeSeconds.
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
Je suis arrivé à ce fil, et aucune des solutions ci-dessus n'a été appliquée à mon cas. En fin de compte, j'ai simplement dû supprimer une barre oblique finale du <AllowedOrigin>
dans la configuration CORS de mon compartiment.
Échoue:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://www.mywebsite.com/</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Victoires:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://www.mywebsite.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
J'espère que cela épargnera à quelqu'un d'arracher les cheveux.
Avertissement - Hack.
Si vous utilisez S3Image pour afficher une image et essayez ensuite de l'obtenir via fetch, peut-être pour l'insérer dans un PDF ou effectuer un autre traitement, soyez averti que Chrome mettra en cache le premier résultat qui ne nécessite pas de demande de contrôle en amont CORS, puis essayez d’obtenir la même ressource sans la demande de contrôle en amont OPTIONS pour l’extraction et échouera en raison des restrictions imposées par le navigateur.
Une autre façon de contourner ce problème consiste à vous assurer que S3Image inclut crossorigin: 'use-credentials' comme indiqué ci-dessus. Dans le fichier que vous utilisez S3Image (j'ai un composant qui crée une version mise en cache de S3Image, c'est donc l'endroit idéal pour moi), substituez la méthode prototype de S3Image, imageEl, pour le forcer à inclure cet attribut.
S3Image.prototype.imageEl = function (src, theme) {
if (!src) {
return null;
}
var selected = this.props.selected;
var containerStyle = { position: 'relative' };
return (React.createElement("div", { style: containerStyle, onClick: this.handleClick },
React.createElement("img", { crossOrigin: 'use-credentials', style: theme.photoImg, src: src, onLoad: this.handleOnLoad, onError: this.handleOnError}),
React.createElement("div", { style: selected ? theme.overlaySelected : theme.overlay })));
};
Le problème 403 est maintenant résolu. Quelle douleur aggrr!
<AllowedOrigin>*</AllowedOrigin>
n’est pas une bonne idée car avec * vous accordez à n’importe quel site web l’accès aux fichiers de votre compartiment. Au lieu de cela, vous devez spécifier quelle origine est exactement autorisée à utiliser les ressources de votre compartiment. Habituellement, c'est votre nom de domaine comme
<AllowedOrigin>https://www.example.com</AllowedOrigin>
ou si vous souhaitez inclure tous les sous-domaines possibles:
<AllowedOrigin>*.example.com</AllowedOrigin>
Comme d'autres ont des états, vous devez d'abord avoir la configuration CORS dans votre compartiment S3:
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod> <!-- Add this -->
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Mais dans mon cas, après cela, cela ne fonctionnait toujours pas. J'utilisais Chrome (probablement le même problème avec d'autres navigateurs).
Le problème était que Chrome mettait en cache l'image avec les en-têtes (ne contenant pas les données CORS), donc, peu importe ce que j'ai essayé de modifier dans AWS, je ne verrais pas mes en-têtes CORS.
Après effacement du cache Chrome et rechargement de la page, l'image contenait les en-têtes CORS attendus.
Dans la dernière console de gestion S3, lorsque vous cliquez sur la configuration CORS dans l'onglet Autorisations, un exemple de configuration CORS par défaut s'affiche. Cette configuration est pas réellement active, cependant! Vous devez d'abord cliquer sur Enregistrer pour activer CORS.
J'ai mis beaucoup de temps à comprendre cela, espérons-le, cela permettra à quelqu'un de gagner du temps.
La réponse acceptée fonctionne, mais il semble que si vous accédez directement à la ressource, il n'y a pas d'en-tête d'origine croisée. Si vous utilisez cloudfront, cela entraînera cloudfront à mettre en cache la version sans en-têtes. Si vous accédez ensuite à une autre URL chargée de cette ressource, vous obtiendrez ce problème d'origine croisée.
Ci-dessous se trouve la configuration et ça va marcher pour moi. J'espère que cela vous aidera à résoudre votre problème sur AWS S3.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<ExposeHeader>ETag</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Cette configuration a résolu le problème pour moi:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<ExposeHeader>ETag</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>