簡體   English   中英

CORS GET在Firefox中返回一個空的響應主體

[英]CORS GET returns an empty response body in Firefox

從RESTful Backbone應用程序,我正在執行從mydomain.commyExtdomain.com CORS請求。

建立CORS我的myExtdomain.com服務器,我響應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.commyExtdomain.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:// )制作的
  • 我很絕望..

在我的所有API調用中添加Cache-Control: no-cache標頭響應(在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之間的這種區別(默認設置??),我會好奇不再關注它。

希望這會節省一些時間。

對我來說,解決方案是在服務器端的響應頭中添加Access-Control-Allow-Credentials: true :這是設置request.withCredentials = true;的對稱request.withCredentials = true; 對於客戶端的XMLHttpRequest對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM