2013-05-29 37 views
36

Wykonuję żądanie CORS xhr. Działa to dobrze w chrome, jednak gdy uruchamiam się na safari, otrzymuję komunikat "Nie można załadować ---- dostęp nie jest dozwolony przez Access-control-allow-origin". Kod jest dokładnie taki sam i ustawiłem CORS na serwerze. Poniżej jest mój kod. (Ma kontrolę dostępu, ale jesteś wolny, aby spróbować bez accessToken)Żądanie CORS nie działa w Safari

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); 

Po zapoznaniu się z nagłówków żądania widzę, że wniosek OPCJE wykonany pierwszy i jest to wniosek, że nie jest dozwolony. Nagłówek pochodzenia nie został uwzględniony w odpowiedzi w Safari, ale jest w chromie. Co by to spowodowało. Każda pomoc będzie bardzo ceniona.

AKTUALIZACJA: Próbowałem w Safari dla systemu Windows i działa, więc nie jestem pewien, co się tutaj dzieje. Mac, którego używam, to zdalny dostęp (Macincloud.com), ale nie sądzę, że miałoby to coś wspólnego z tym.

Odpowiedz

4

Dzięki za wszystkie odpowiedzi, w końcu to dostałem. Dodałem "Origin" do moich odpowiedziHeaders i teraz działa dobrze.

+17

Czy mógłbyś rozwinąć nieco odpowiedzi. – Sohaib

0

Aby uzyskać żądanie CORS, należy użyć adresu początkowego fflog.storage.googleapis.com. Jeśli używasz wspólnego źródła storage.googleapis.com, każda witryna może uzyskać dostęp do Twojego zasobnika.

spróbuj spróbować usunąć overrideMimeType? Jeśli ustawisz typ MIME, powróci on poprawnie.

Mam również problem z prośbą o wysłanie żądania do przeglądarki Safari, ale nie otrzymałem jeszcze odpowiedzi. GET jest OK.

+0

Próbowałem i to nie działało ... również próbowałem drugiego adresu URL bez powodzenia:/ – Patrick

0

gdy próbuję

curl -v -X OPTIONS \ 
    -H 'Origin: fflog.storage.googleapis.com' \ 
    -H 'Access-Control-Request-Method: GET' \ 
    https://storage.googleapis.com/fflog/135172watersupplies_json 

uzyskać między innymi nagłówkami:

Access-Control-Allow-Origin: * 

Kiedy wykonać żądań AJAX przeciwko https://storage.googleapis.com/fflog/135172watersupplies_json z Safari 6.0.4 na Mac OS 10.8.3 otrzymuję 403 błędy , ale wszystkie wykonują.

Mogę się tylko domyślać, że próbujesz wysłać credentialed request, dla której nie można użyć symbolu wieloznacznego Access-Control-Allow-Origin.

+0

Dzięki za wpis. ale aby naprawdę przetestować CORS przy pomocy cURL, musisz ustawić nagłówek początku, aby symulował środowisko przeglądarki. – Patrick

0

spróbuj usunąć overlime typu MIME.

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(); 
+0

nie działa dla mnie ... – Patrick

0

Kiedy zapytań URL dostaję z powrotem następujące Access-Control headers:

Access-Control-Allow-Origin: * 
Access-Control-Expose-Headers: Authorization, Cache-Control, Content-Length, Date, Expires, Server, Transfer-Encoding, x-goog-meta-foo1 

Podejrzewam, że ma to coś wspólnego z nagłówków Access-Control - albo jesteś pozostawiając coś, lub jest zbyt szczegółowe.

Biorąc pod uwagę, że jesteś rzeczywiście wysyłania niestandardowego nagłówka, można też spróbować:

Access-Control-Allow-Headers: * 

Można również sprawdzić, czy pomijając Access-Control-Expose-Headers robi różnicę.

Poza tym pomocne byłoby zobaczenie rzeczywistych nagłówków żądania/odpowiedzi.

+0

Kontrolki kontroli dostępu nie zezwalają na stosowanie symboli wieloznacznych, muszą to być dokładne dopasowania - http://www.w3.org/TR/cors/#access-control- allow-headers-response-header –

37

Napotkano ten sam błąd podczas wysyłania żądania XHR do pliku w Amazon S3. W Safari 7 to się nie udało.Wiem, że nie korzystasz z Amazon S3, ale pomyślałem, że opublikuję na wypadek, gdyby to rozwiązanie pomogło innym.

Problem polegał na tym, że Safari 7 ustawić nagłówek Access-Control-request-nagłówki "pochodzenie, X-żądany-z", ale moja konfiguracja AWS CORS dozwolone tylko "x-o-with":

<?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> 

Dodałem "origin" jako dozwolony nagłówek i wszystko działało dobrze.

 <AllowedHeader>origin</AllowedHeader> 

Uwaga: the AllowedOrigin z * tylko dla celów rozwojowych. Zobacz @ i komentarz poniżej, aby uzyskać więcej informacji.

+0

Dziękuję bardzo, Seth. Jesteś ratownikiem: P – leods92

+0

Wiem, że nie powinniśmy mówić "Dzięki", ale świętym gównem, z którym walczyłem z Safari przez długi czas! To wystarczy! – teewuane

+5

Jeśli przestrzegasz tego przykładu, pamiętaj, że użycie * dla AllowedOrigin jest w rzeczywistości przeznaczone dla środowisk deweloperów - w większości przypadków należy używać białej listy w produkcji. Oto przykład implementowania białej listy: https://github.com/monsur/CORSinAction/blob/master/ch07/listing-7.1/app.js – andes

3

Po prostu miałem podobny problem, błąd CORS. Będzie działać w przeglądarce Firefox & Chrome, ale nie Safari 10.

Okazało się, że musimy umieścić końcowy ukośnik na adresie URL JSON.

0

Jeśli chodzi o Amazon S3, działało to tylko w Safari po dodaniu większej liczby dozwolonych nagłówków, Content-Type i Range. Jeden z nich wykonał zadanie.

<?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> 
Powiązane problemy