【问题标题】:CORS GET returns an empty response body in FirefoxCORS GET 在 Firefox 中返回一个空的响应正文
【发布时间】:2013-11-28 13:06:33
【问题描述】:

从一个 RESTful Backbone 应用程序,我正在执行从 mydomain.commyExtdomain.com 的 CORS 请求。

确实在我的 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

对于我在myExtdomain.com 上的 API 调用:

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

Status Code: HTTP/1.1 200 OK

我什至拼命地尝试用所有东西来响应 所有我在 myExtdomain.com 上的 HTTP 请求:

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 请求“有点失败”...

“有点失败”的定义

  • 返回的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

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

结束的想法

  • 如您所见,魔术GET 请求的响应标头甚至不包括我在myExtdomain.com 上设置的CORS 标头
  • 另一方面,PUT 请求确实包含它们..
  • 再一次,在 Chrome 中一切正常,所有响应标头都存在,我的 JSON 符合预期,等等。
  • 我花了相当长的时间studyingCORS(显然还不够),试图分解需要/不需要的内容,而不是复制/粘贴随机代码
  • JSONP for GET requests 对我来说不是替代方案
  • 我所有的请求(任何动词)都来自非安全页面(不是来自https://
  • 我很绝望..

【问题讨论】:

  • 对于您的获取请求,内容长度是否每次都非零?或者它有时也不为零(1/100)?
  • 有时非零 (1/100)。所以大多数时候都是 0 KB (99/100)。基本上一切都按预期工作 1/100 次。

标签: javascript firefox backbone.js cors


【解决方案1】:

对我来说,解决方案是在服务器端的响应头中添加Access-Control-Allow-Credentials: true:这是在客户端为XMLHttpRequest 对象设置request.withCredentials = true; 的对称性。

【讨论】:

  • 这确实令人惊讶,即使通信是通过无状态 REST 协议进行的。 CORS 的设计真的很糟糕。
【解决方案2】:

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

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

由于某种原因,Firefox 正在缓存我的 API 调用,缓存后,FF 无法再次解析 JSON。最终出现空响应正文或任何错误。

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

同样,Chrome 一切正常,Chrome 不需要 Cache-Control: no-cache 标头。

如果有人知道 FF 和 Chrome 之间的这种区别(默认设置??),我会对此感到好奇。

希望这会为某人节省一些时间。

【讨论】:

  • 它确实为我节省了一些时间。谢谢
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多