CORS GET在Firefox中返回一个空的响应主体

eig*_*ive 15 javascript firefox cors backbone.js

从一个RESTful应用骨干,我从做CORS请求mydomain.commyExtdomain.com.

确实在我的myExtdomain.com服务器上设置了CORS ,我正在响应OPTIONS动词(任何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
Run Code Online (Sandbox Code Playgroud)

我的API调用myExtdomain.com:

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

Status Code: HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)

我甚至拼命地试图回应我所有的 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
Run Code Online (Sandbox Code Playgroud)

问题

  • 在Chrome中一切正常
  • 在Firefox中,我的PUT请求有效,但我的GET请求"有点失败"......

"有点失败"的定义

  • 返回的HTTP状态代码是 200 OK
  • 但响应是空的(无响应体/大小0 KB)..它应该是一些JSON.
  • 但是,出于某种原因,每100次一次,一次GET请求就有效

无聊的细节又名"标题"

回应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
Run Code Online (Sandbox Code Playgroud)

一个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_
Run Code Online (Sandbox Code Playgroud)

魔术 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's supposed to be some JSON, that *SOMETIMES* (1/100) I get.. Magic.
Run Code Online (Sandbox Code Playgroud)

结束思想

  • 正如您所看到的,魔术GET请求的响应标头甚至不包括我设置的CORS标头myExtdomain.com
  • PUT另一方面,请求确实包括他们..
  • 同样,Chrome中的一切工作正常,所有的响应标题都存在,我得到了我的JSON预期等等.
  • 我花了相当长的时间研究 CORS(显然还不够),试图分解需要/不需要的东西而不是复制/粘贴随机代码
  • JSONP对于GET请求不是我的替代方案
  • 我的所有请求(任何动词)都是由非安全页面(不是来自https://)
  • 我很绝望..

eig*_*ive 17

Cache-Control: no-cache标题添加到我的所有API调用响应(on myExtdomain.com)解决了我的问题:

Access-Control-Allow-Origin: *
Content-Type: application/json
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)

出于某种原因,Firefox正在缓存我的API调用,并且在缓存时,FF无法再次解析JSON.在空响应体中结束或者出现任何错误.

现在我记得这不是我第一次强迫no-cache使用Firefox ..

再一次,Chrome的一切正常,Chrome不需要Cache-Control: no-cache标题.

如果有人知道FF和Chrome之间的这种区别(默认设置??),我会好奇不再关注它.

希望这会节省一些时间.