Запрос CORS не работает в Safari

Я делаю запрос CORS xhr. Это отлично работает в chrome, однако, когда я запускаю safari, я получаю "не могу загрузить - - - - доступ не разрешен Access-control-allow-origin". Код точно такой же и я поставил кеш на сервере. Ниже приведен мой код.(контроль доступа, но вы можете попробовать без специального 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);

после просмотра заголовков запросов я вижу, что сначала выполняется запрос опций, и это запрос, который не разрешен. Этот заголовок origin не включен в ответ в Safari, но находится в chrome. Что могло вызвать это. Любая помощь будет очень признательна.

обновление: Я пробовал в Safari для Windows, и он работает, поэтому я не уверен, что здесь происходит. Mac, который я использую, является удаленным доступом (Macincloud.com), но я не думаю, что это имеет какое-то отношение к этому.

9 ответов


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

проблема заключалась в том, что Safari 7 установил заголовок Access-Control-Request-Headers в "origin, x-requested-with", но моя конфигурация AWS CORS разрешила только"x-requested-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>

я добавил "origin" в качестве разрешенного заголовка, и все сработало штраф.

        <AllowedHeader>origin</AllowedHeader>

Примечание: The AllowedOrigin of * только для целей развития. См. комментарий @andes ниже для получения дополнительной информации.


Спасибо за все ответы, я понял, наконец, себя. Я добавил "Origin" к моим responseHeaders и теперь отлично работает.


У меня просто была аналогичная проблема, ошибка CORS. Он будет работать в Firefox и Chrome, но не Safari 10.

оказалось, нам нужно было поставить косую черту на URL JSON.


для запроса CORS вы должны использовать свой origin fflog.storage.googleapis.com. Если вы используете общие storage.googleapis.com origin, любой сайт может получить доступ к вашему ведру.

попробуйте попробовать удалить overrideMimeType? Если вы установите тип mime, он вернется правильно.

у меня также есть проблема с запросом Safari POST, но пока нет ответа. Вам хорошо.


попробуйте удалить 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();

когда я запрашиваю Ваш URL, я возвращаю следующее заголовки управления доступом:

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

Я подозреваю, что это как-то связано с вашими заголовками управления доступом - либо вы что-то упускаете, либо слишком конкретны.

учитывая, что вы на самом деле отправляете пользовательский заголовок, вы можете попробовать:

Access-Control-Allow-Headers: *

вы также можете увидеть, если оставить Access-Control-Expose-Headers имеет значение.

помимо этого, это было бы действительно полезно чтобы увидеть фактические заголовки запроса / ответа.


когда я пытаюсь

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 ошибки, но они все выполняются.

поэтому я могу только догадываться, что вы пытаетесь отправить credentialed request для которого подстановочный знак Access-Control-Allow-Origin не допускается.


Что касается Amazon S3, он работал только в safari после того, как я добавил более разрешенные заголовки, тип контента и диапазон. Один из них сделал свое дело.

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

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