CORS GET 在 Firefox 中返回一个空的响应体
CORS GET returns an empty response body in Firefox
来自 RESTful 主干应用程序,我正在执行从 mydomain.com
到 myExtdomain.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
对我的 API 调用myExtdomain.com
:
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
,等等。 - 我花了相当长的时间研究 CORS(显然还不够),试图分解需要/不需要的内容,而不是复制/粘贴随机代码
-
GET
请求的JSONP
对我来说不是其他选择 - 我的所有请求(任何动词)都是从非安全页面(而不是来自
https://
)发出的 - 我很绝望..
将 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 不需要 Cache-Control: no-cache
标头。
如果有人知道FF和Chrome之间的这种区别(默认设置??),我会很好奇地想知道更多。
希望这会为某人节省一些时间。
对我来说
,解决方案是在服务器端的响应标头中添加Access-Control-Allow-Credentials: true
:这是在客户端为XMLHttpRequest
对象设置request.withCredentials = true;
的对称性。
相关文章:
- 有一个响应式按钮
- 必须单击两次才能得到一个响应
- 具有一个响应的多个回调-Node JS
- 通过管道将多个文件传送到一个响应
- 如何创建一个响应单击或输入按下的 javascript 函数
- XMLHttpRequest分块响应,只读取正在进行的最后一个响应
- 我如何引用并返回一个响应,基于一个单选按钮的答案,该单选按钮包含在另一个单选键中
- AJAX——可以在请求响应上标记到前一个响应的末尾
- 在expressjs中,从函数向路由发送一个响应
- 如何用react构建一个响应式网站
- 如何设置一个响应chart.js图表不填满屏幕
- 如何在html css和jquery上创建一个响应式菜单,逐个隐藏li元素
- 我如何使一个响应图像地图,其中图像和热点自动调整大小与窗口
- 创建一个响应式html表
- 如何使用fancybox创建一个响应式弹出框
- 寻找一个响应式javascript图表库
- 创建一个响应式容器
- 如何解析json中的一个响应
- 做一个响应式的Javascript水平导航,中间有Logo
- 卓别林是一个响应路由的永久控制器