2015-12-14 124 views
3

每當我嘗試添加自定義請求標頭到我的$ http請求標頭不會顯示在請求中,而不是它的Access-Control-Request-HeadersAccess-Control-Request-Headers:accept, testHeader 請參閱下面的在Chrome的網絡選項卡輸出:

Request Headers: 
    OPTIONS /v/xyx/abc/query?q=SELECT%20duration%20FROM%20TimeTable HTTP/1.1 
    Host: example.com 
    Connection: keep-alive 
    Access-Control-Request-Method: GET 
    Origin: http://localhost 
    User-Agent: XXXXXXXX Chrome XXXXXXX 
    Access-Control-Request-Headers: accept, testHeader 
    Accept: */* 
    Referer: http://localhost/test/ 
    Accept-Encoding: gzip, deflate, sdch 
    Accept-Language: en-US,en;q=0.8 

然而,我期待這樣的:

Request Headers: 
    OPTIONS /v/xyx/abc/query?q=SELECT%20duration%20FROM%20TimeTable HTTP/1.1 
    Host: example.com 
    Connection: keep-alive 
    Access-Control-Request-Method: GET 
    Origin: http://localhost 
    User-Agent: XXXXXXXX Chrome XXXXXXX 
    Accept: application/json 
    testHeader: zdhfguwe87fg8378287efijb8 
    Referer: http://localhost/test/ 
    Accept-Encoding: gzip, deflate, sdch 
    Accept-Language: en-US,en;q=0.8 

我如何防止這種情況下,請求頭髮生,並顯示標題?

見Angularjs的$ http服務,我已經跟着的config

//***TRIED BOTH OF THESE: 
//***TRY#1 $http.get(url, {headers:{"Accept": "application/json", "testHeader": "zdhfguwe87fg8378287efijb8"}}).then(....... 
//***TRY#2 
     $http({ 
     method: 'GET', 
     url: url, 
     headers: { 
      "Accept": "application/json", 
      "testHeader": "zdhfguwe87fg8378287efijb8" 
     } 
     }) 
     .then(
     function(){ 
      //success 
      console.log(arguments); 
     }, function(){ 
      //fail 
      console.log(arguments); 
     }); 
+0

即使不看它,也很難調試代碼。 – katspaugh

+1

@katspaugh添加了代碼。 –

回答

3

這是預期的行爲作爲CORS-預檢,這是一個OPTIONS請求的一部分。一旦這個請求成功,實際的GET請求將被瀏覽器用自定義頭部觸發,因爲服務器接受了它們。

CORS請求僅默認批准了一組有限的頭文件,因此要添加其他頭文件(包括您的自定義頭文件),CORS預檢請求需要向服務器請求Access-Control-Request-Headers HTTP頭文件的權限。

請參見:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

1

它有血性了我3個小時搜索fxxking答案。 基本上很簡單,只要讓愚蠢的服務器接受客戶頭。

我所做的是在加入這些爲.htaccess

<IfModule mod_headers.c> 
     Header add Access-Control-Allow-Origin "*" 
     Header add Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" 
     Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, x-custom-header-here" 
</IfModule> 

現在,它可以讓服務器(API),以接受來自世界各地的Ajax請求與大多數方法也無論您的自定義標題是或標題是。

它將清除'preflight響應中的Access-Control-Allow-Headers不允許請求標頭字段內容類型的錯誤信息。

fxxking所有這些愚蠢的規則製造者!