Je fais une demande xhr CORS. Cela fonctionne très bien en chrome, mais lorsque je lance Safari, le message «Impossible de charger ---- l'accès n'est pas autorisé par Access-control-allow-Origin». Le code est exactement le même et j'ai mis le CORS sur le serveur. Ci-dessous, mon code. (Possède un contrôle d'accès, mais vous êtes libre d'essayer sans accessToken)
var water;
var req = new XMLHttpRequest;
req.overrideMimeType("application/json");
req.open('GET', 'https://storage.googleapis.com/fflog/135172watersupplies_json', true);
req.setRequestHeader('Authorization', 'Bearer ' + accessToken);
origThis = this;
var target = this;
req.onload = function() {
water = req;
req.send(null);
Après avoir examiné les en-têtes de requête, je constate qu'une requête OPTIONS est effectuée en premier et que cette requête n'est pas autorisée. L'en-tête Origin n'est pas inclus dans la réponse dans Safari, mais en chrome. Qu'est-ce qui causerait ça? Toute aide serait grandement appréciée.
UPDATE: J'ai essayé Safari pour Windows et ça marche, donc je ne suis pas sûr de ce qui se passe ici. Le Mac que j'utilise est un accès à distance (Macincloud.com), mais je ne pense pas que cela y soit pour quelque chose.
Merci pour toutes les réponses, je l’ai enfin moi-même. J'ai ajouté 'Origin' à mon ResponseHeaders et fonctionne bien maintenant.
J'ai rencontré la même erreur lors d'une requête XHR sur un fichier dans Amazon S3. Sur Safari 7, il échouait. Je sais que vous n'utilisez pas Amazon S3, mais je pensais poster si cette solution aidait les autres.
Le problème était que Safari 7 avait défini l'en-tête "Control-Request-Request-Headers" sur "Origine, avec-demandé-avec", mais ma configuration AWS CORS n'autorisait que "x-demandé-avec":
<?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>
<AllowedHeader>x-requested-with</AllowedHeader>
</CORSRule>
</CORSConfiguration>
J'ai ajouté "Origin" comme en-tête autorisé et tout a bien fonctionné.
<AllowedHeader>Origin</AllowedHeader>
Remarque : AllowedOrigin of *
sert uniquement à des fins de développement. Voir commentaire @andes ci-dessous pour plus d'informations.
Je viens d'avoir un problème similaire, erreur CORS. Cela fonctionnerait dans Firefox et Chrome mais pas dans Safari 10.
Il s'est avéré que nous devions mettre la barre oblique finale sur l'URL JSON.
Pour une demande CORS, vous devriez utiliser votre code d'origine fflog.storage.googleapis.com
. Si vous utilisez storage.googleapis.com
Origin, tous les sites peuvent accéder à votre compartiment.
ai essayé essayez de supprimer overrideMimeType
? Si vous définissez le type mime, il retournera correctement.
J'ai également un problème avec la requête Safari POST, mais je n'ai pas encore de réponse. GET est OK.
essayez de supprimer le type mime prioritaire.
var
jsonhandler=function(){var req=JSON.parse(this.response);console.log(req)},
req=new XMLHttpRequest;
req.open('GET','https://storage.googleapis.com/fflog/135172watersupplies_json');
req.setRequestHeader('Authorization','Bearer '+accessToken);
req.onload=jsonhandler;
req.send();
Quand j'essaye
curl -v -X OPTIONS \
-H 'Origin: fflog.storage.googleapis.com' \
-H 'Access-Control-Request-Method: GET' \
https://storage.googleapis.com/fflog/135172watersupplies_json
Je reçois, entre autres en-têtes:
Access-Control-Allow-Origin: *
Lorsque j'exécute des requêtes AJAX par rapport à https://storage.googleapis.com/fflog/135172watersupplies_json
à partir de Safari 6.0.4 sous Mac OS 10.8.3, j'obtiens des erreurs 403, mais elles s'exécutent toutes.
Je ne peux donc que supposer que vous essayez d’envoyer une demande avec des informations d’identification pour laquelle un caractère générique Access-Control-Allow-Origin
n’est pas autorisé.
Quant à Amazon S3, cela ne fonctionnait que dans safari après avoir ajouté plus d’en-têtes autorisés, Content-Type et Range. L'un d'entre eux a fait le travail.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
<AllowedHeader>Origin</AllowedHeader>
<AllowedHeader>X-Requested-With</AllowedHeader>
<AllowedHeader>Content-Type</AllowedHeader>
<AllowedHeader>Range</AllowedHeader>
</CORSRule>
</CORSConfiguration>
J'ai eu le même problème où CORS travaillait dans Chrome, mais jeta une erreur Origin dans Safari. Il s'est avéré qu'il s'agissait d'un problème d'autorisation Kerberos. Lorsque j'ai chargé l'URL XHR directement dans Safari, des informations d'identification m'ont été demandées. Après les avoir saisies, je suis retourné au site d'origine et Safari n'avait plus l'erreur CORS.
Dans mon cas, il s'agissait d'un problème pour l'en-tête Accept-Langauge. J'ai ajouté Accept-Language
à l'intérieur de Access-Control-Allow-Headers
et le problème a été résolu.
Lorsque j'interroge votre URL, je récupère les en-têtes suivants: Access-Control :
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Authorization, Cache-Control, Content-Length, Date, Expires, Server, Transfer-Encoding, x-goog-meta-foo1
Je soupçonne que cela a quelque chose à voir avec vos en-têtes Access-Control: vous oubliez quelque chose ou vous êtes trop spécifique.
Étant donné que vous envoyez un en-tête personnalisé, vous voudrez peut-être essayer:
Access-Control-Allow-Headers: *
Vous pouvez également voir si le fait de laisser Access-Control-Expose-Headers
fait une différence.
Au-delà, il serait utile de voir les en-têtes de requête/réponse réels.