CORS GET возвращает пустое тело ответа в Firefox

Из приложения RESTful Backbone, я делаю запросы CORS от mydomain.com до myExtdomain.com.

Я установил CORS на моем сервере myExtdomain.com, я отвечаю на OPTIONS verb (любой URL) с помощью

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers: Content-Type

Status Code: HTTP/1.1 204 No Content

И для моего API вызывает myExtdomain.com с помощью:

Access-Control-Allow-Origin: *
Content-Type: application/json

Status Code: HTTP/1.1 200 OK

Я даже отчаянно пытался ответить на все мои HTTP-запросы на myExtdomain.com всем:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers: Content-Type
Content-Type: application/json

Status Code: HTTP/1.1 200 OK

Проблема

  • Все работает отлично в Chrome
  • В Firefox мои запросы PUT работают, но мои GET запрашивают "kinda fail"...

Определение "Отказ от отказа"

  • Возвращенный код состояния HTTP: 200 OK
  • Но ответ пуст (No Response Body/Size 0 KB). Предполагается, что это будет JSON.
  • Но по какой-то причине каждый раз в 100 раз один GET запрос работает

Скучные детали a.k.a "Заголовки"

Отвечая на OPTIONS глагол:

REQUEST HEADERS
-----------------
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0
Origin: http://mydomain.com
Host:   www.myExtdomain.com
Connection: keep-alive
Access-Control-Request-Method:  PUT
Access-Control-Request-Headers: content-type
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

RESPONSE HEADERS
-----------------
X-Powered-By:   ASP.NET
Server: Microsoft-IIS/7.0
Date:   Fri, 15 Nov 2013 07:01:57 GMT
Content-Type:   text/html
Access-Control-Allow-Origin:    *
Access-Control-Allow-Methods:   POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers:   Content-Type

A PUT запрос:

REQUEST HEADERS
----------------
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0
Referer:    http://mydomain.com/account
Origin: http://mydomain.com
Host:   www.myExtdomain.com
Content-Type:   application/json; charset=UTF-8
Content-Length: 36
Connection: keep-alive
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: application/json, text/javascript, */*; q=0.01

RESPONSE HEADERS
----------------
X-Powered-By:   ASP.NET
Server: Microsoft-IIS/7.0
Date:   Fri, 15 Nov 2013 07:01:57 GMT
Content-Type:   application/json
Content-Length: 0
Access-Control-Allow-Origin:    *

BODY RESPONSE
--------------
_Some_Json_Here_

Волшебный GET запрос:

REQUEST HEADERS
----------------
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0
Referer:    http://mydomain.com/somepage
Origin: http://mydomain.com
Host:   www.myExtdomain.com
Connection: keep-alive
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: application/json, text/javascript, */*; q=0.01

RESPONSE HEADERS
----------------
Server: Microsoft-IIS/7.0
Last-Modified:  Fri, 15 Nov 2013 06:58:18 GMT
Date:   Fri, 15 Nov 2013 07:01:57 GMT
Content-Type:   application/json
Content-Length: 4041
Connection: keep-alive

RESPONSE BODY
--------------
Empty (0KB), it supposed to be some JSON, that *SOMETIMES* (1/100) I get.. Magic.

Закрытие мысли

  • Как вы видите, заголовки ответов магического запроса GET даже не включают заголовки CORS, которые я устанавливаю на myExtdomain.com
  • Запрос PUT, с другой стороны, включает их.
  • Снова все работает отлично в Chrome, все заголовки ответов присутствуют, я получаю свой JSON, как ожидалось, и т.д.
  • Я провел довольно долгое время изучение CORS (по-видимому, было недостаточно), пытаясь разбить то, что нужно/не нужно, а не копировать/вставлять случайный код.
  • JSONP для GET запросов для меня не является альтернативой
  • Все мои запросы (любые глаголы) сделаны из незащищенных страниц (не из https://)
  • Я в отчаянии.

Ответы

Ответ 1

Добавление заголовка Cache-Control: no-cache ко всем вызовам API Ответы (на myExtdomain.com) решили мою проблему:

Access-Control-Allow-Origin: *
Content-Type: application/json
Cache-Control: no-cache

По какой-то причине Firefox кэшировал мои вызовы API, а при кэшировании FF не смог снова разобрать JSON. Завершился в пустой тело ответа или какая-либо ошибка, которая была.

Теперь я помню, что это не первый раз, когда мне приходится форсировать no-cache с помощью Firefox..

Опять же, все отлично работает с Chrome, Chrome не нуждается в заголовке Cache-Control: no-cache.

Если кто-то знает об этой разнице между FF и Chrome (настройки по умолчанию?), мне было бы любопытно не об этом.

Надеюсь, это сэкономит время кому-то.

Ответ 2

Для меня решение заключалось в том, чтобы добавить Access-Control-Allow-Credentials: true в заголовки ответов на стороне сервера: это симметричный параметр request.withCredentials = true; для объекта XMLHttpRequest на стороне клиента.