CORS запыт не працуе ў Safari

Я раблю запыт XHR CORS. Гэта выдатна працуе ў хром, аднак, калі я бягу ў сафары я атрымліваю «Не ўдаецца загрузіць ---- доступ не дапускаецца Access-Control-Allow-Origin». Код сапраўды такі ж, і я ўсталяваць CORS на сэрвэры. Ніжэй мой код. (Ці мае кантроль доступу, але вы можаце паспрабаваць без маркера доступу)

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

Пасля прагляду загалоўкаў запыту я бачу, што запыт OPTIONS робіцца першым, і гэта патрабаванне, не дапускаецца. Загаловак паходжання не ўваходзіць у адказ у Safari, але ў хром. Што б прывесці да гэтага. Любая дапамога будзе прынятая з удзячнасьцю.

UPDATE: Я паспрабаваў у Safari для Windows, і гэта працуе, так што я не ўпэўнены, што тут адбываецца. Макінтош, што я выкарыстоўваю аддаленага доступу (Macincloud.com), але я не думаю, што будзе мець нічога агульнага з ім.

38

9 адказы

Я сутыкнуўся з тымі ж памылкамі пры выкананні запыту XHR супраць файла ў Amazon S3. У Safari 7 ён трываў няўдачу. Я ведаю, што вы не карыстаецеся Amazon S3, але я думаў, што пост у выпадку, калі гэта рашэнне дапамагло іншым.

Праблема складалася ў тым, што Safari 7 усталяваны загаловак Access-Control-Request-Headers да "паходжання, X-Requested-с", але мая канфігурацыя AWS CORS дапускаецца толькі "X-Requested-з":

<?xml version="1.0" encoding="UTF-8"?>

    
        *
        GET
        3000
        Authorization
        x-requested-with
    

Я дадаў «паходжанне» у якасці дазволенага загалоўка і ўсё працавала нармальна.

        origin

Note: the AllowedOrigin of * is for development purposes only. See @andes comment below for more information.

40
дададзена
Я ведаю, што мы не павінны казаць "дзякуй", але святое дзярмо я змагаўся гэтую рэч з Safari на працягу доўгага часу! Гэта зрабіў трук!
дададзена аўтар teewuane, крыніца
Калі вы будзеце прытрымлівацца гэтага прыкладу, звярніце ўвагу, што выкарыстанне * для AllowedOrigin сапраўды прызначаны для Дзевай асяроддзя - вы павінны выкарыстоўваць белы спіс у вытворчасці, для большасці выпадкаў выкарыстання. Вось прыклад рэалізацыі белага спісу: github.com/ масье/CORSinAction/блоб/вядучы/CH07/пералічэнне-7.1/& ZWNJ; & hellip;
дададзена аўтар andes, крыніца
Вялікі дзякуй, Сэт. Вы выратавальнік: P
дададзена аўтар leods92, крыніца

Дзякуй за ўсе адказы, я атрымаў гэта, нарэшце, сам. Я дадаў «Origin» ў маіх responseHeaders і цяпер працуе выдатна.

5
дададзена
Не маглі б вы расказаць крыху пра рэакцыю.
дададзена аўтар Sohaib, крыніца

I just had a similar problem, CORS error. It would work in Firefox & Chrome but not Safari 10.

Аказалася, нам трэба паставіць слэш на URL JSON.

3
дададзена
не дзейнічае для мяне ...
дададзена аўтар kfn, крыніца

Калі я спрабую

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

Я атрымліваю, сярод іншых загалоўкаў:

Access-Control-Allow-Origin: *

Калі я выконваю AJAX запыты супраць https://storage.googleapis.com/fflog/135172watersupplies_json з Safari 6.0.4 на Mac OS 10.8.3 Я атрымліваю 403 памылкі, але яны ўсё выконваюць.

So I can only guess that you are trying to send a credentialed request for which a wildcard Access-Control-Allow-Origin is not allowed.

0
дададзена
Дзякуй за паведамленне. але па-сапраўднаму выпрабаваць CORS з Curl вам неабходна ўсталяваць загаловак паходжання для імітацыі навакольнага асяроддзя браўзэра.
дададзена аўтар Patrick, крыніца

Калі я Запытаная ваш URL я атрымліваю назад наступнае загалоўкі Access-Control :

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

Я падазраю, што гэта нешта рабіць з вашымі загалоўкамі Access-Control - альбо вы пакідаеце нешта, ці быць занадта спецыфічныя.

Улічваючы, што вы на самай справе адпраўкі карыстацкага загалоўка, вы можаце паспрабаваць:

Access-Control-Allow-Headers: *

Вы таксама можаце ўбачыць, калі пакіданне з Access-Control-Expose-Headers робіць розніцу.

Акрамя таго, гэта фактычна будзе карысна убачыць фактычныя загалоўкі запыту/адказу.

0
дададзена
Access-Control-Allow-Headers не дазваляе падстаноўныя, ён павінен быць дакладным адпаведнасцю - w3.org/TR/cors/#access-control-allow-headers-response-header
дададзена аўтар Jérémy F., крыніца

Для CORS прасіць вы павінны выкарыстоўваць ваша паходжанне fflog.storage.googleapis.com . Калі вы выкарыстоўваеце агульны storage.googleapis.com паходжанне, любы сайт можа атрымаць доступ да вашага вядра.

ёсць паспрабаваць паспрабаваць выдаліць overrideMimeType ? Калі вы ўсталюеце тып пантамімы, ён будзе вяртаць правільна.

У мяне таксама ёсць праблемы з запытам Safari POST, але адказу пакуль няма. GET ў парадку.

0
дададзена
Я паспрабаваў і гэта не спрацавала ... таксама паспрабаваў іншы URL не повезло: /
дададзена аўтар Patrick, крыніца

паспрабуйце выдаліць overide MimeType.

 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
дададзена
не працуе для мяне ...
дададзена аўтар Patrick, крыніца

Што тычыцца Amazon S3, ён працаваў толькі ў сафары пасля таго як я дадаў яшчэ дазволена загалоўкі, Content-Type і Range. Адзін з іх зрабіў сваю працу.

<?xml version="1.0" encoding="UTF-8"?>

    
        *
        GET
        POST
        3000
        Authorization
        Origin
        X-Requested-With
        Content-Type
        Range
    

0
дададзена

У мяне была тая ж праблема, дзе CORS працаваў у Chrome, але кінуў памылку паходжання ў Safari. Аказалася, гэта была праблема аўтарызацыі Kerberos. Калі я загрузіў URL XHR непасрэдна ў Safari, мне прапанавана ўвесці уліковыя дадзеныя. Пасля ўводу іх, я вярнуўся на зыходны сайт, і Safari больш не было памылкі CORS.

0
дададзена