2015-09-01 6 views
8

У меня проблема с тем, как Safari обрабатывает запросы CORS. Рассмотрим следующий сценарий:Safari не выполняет запрос CORS после перенаправления 302

  1. DomainA принимает страницу, которая делает запрос XHR к DomainB (заголовок происхождения устанавливается в DomainA)
  2. DomainB возвращает 302 редирект сделать DomainC (заголовок происхождения устанавливается в нуль, который, кажется, OK с RFC)
  3. DomainC возвращают ответ 200 с фактическим содержанием

Это работает в Chrome, FF, но он не на сафари (проверено на Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600,8 .9 (KHTML, как и Gecko) Версия/8.0.8 Safari/600.8.9).

Когда я делаю запрос без включения xhr.withCredentials, во-первых, Safari делает запрос предварительной проверки OPTIONS до фактического запроса DomainC, который IMHO не является обязательным, поскольку все запросы являются простыми, но я могу обрабатывать. Проблема заключается в сбое Safari после предполетного запроса DomainC, говорящего «Невозможно сделать запрос с нулевым». Я могу обойти это, установив Access-Control-Allow-Origin в * и отменив заголовок Access-Control-Allow-Credentials (они являются взаимоисключающими), что сделало бы этот сценарий работать. Однако я все еще думаю, что это неправильное поведение.

Теперь мне нужны учетные данные, которые нужно передать (и нет, я не могу передать его каким-либо другим способом, поскольку это зависит от некоторых сторонних серверов). Итак, давайте установим

xhr.withCredentials

истина, и мы вернулись к «Не может сделать любой запрос от нуля», а теперь даже подстановочные знаки Access-Control-Allow-Credentials не помогает.

Я думаю, что все заголовки CORS установлены правильно, но, пожалуйста, не стесняйтесь меня проверять. Пример испытания можно найти здесь: http://a.ihatesafari.com

Что здесь происходит? Это ошибка, или я чего-то не хватает?

Спасибо за ответы

+0

Он даже терпит неудачу в более простом случае DomainA, создающем XHR для DomainA и перенаправляясь на DomainC. – hrdwdmrbl

ответ

3

я испытывал эту проблему, а также и нашли this bug с 2012 года, что, как представляется, описывать его. Запуск тестового кода, упомянутого в ошибке в FF/Chrome/Safari, приводило к ошибкам только в Safari. Похоже, что ошибка не была исправлена.

В конечном счете, чтобы обойти это, я изменил наш HTTP API, чтобы добавить необязательный параметр запроса, чтобы вызвать другой ответ, который возвратил 200 OK с телом JSON, содержащим URL-адрес, которым должен следовать клиент. К сожалению, если вы являетесь потребителем чужого HTTP API, это не поможет.

+0

Я испытываю эту проблему при вызове стороннего API. Любая идея о том, как я могу обойти (или решить) это? – elTomato

+0

Если у вас есть собственный веб-сервер/API, возможно, вы можете связать вызов стороннего API с вызовом, который вы реализуете на своем сервере, который работает так, как может работать Safari. – MisterG

Смежные вопросы