2016-08-03 79 views
10

從我讀過有關CORS,我的理解它應該工作如下:CORS:爲什麼我的瀏覽器不發送OPTIONS預檢請求?

  1. 腳本在客戶端試圖從服務器不同產地獲取資源
  2. 瀏覽器攔截此請求,並首先將預檢選項請求設置爲相同的URL。
  3. 如果響應該預檢請求包含適當的報頭(例如Access-Control-Allow-Origin: *),瀏覽器理解它允許發送主請求和做它。
  4. 響應返回給客戶端腳本。

我已經建立了一個測試這樣的:

  • 服務器轉到同時接受 - GET和OPTIONS請求(使用curl檢查) - 和響應
  • 設置 Access-Control-*
  • 簡單的HTML頁面下面的腳本在它(jQuery的$站)(由另一個端口上的另一個服務器提供):

    $.ajax({ 
        type: "GET", 
        crossDomain: true, 
        url: "http://local.site.com/endpoint, 
        success: function (data) { 
        alert(data); 
        }, 
        error: function (request, error) { 
        alert(error); 
        } 
    }); 
    

當我把這種方法,但是,我只看到一個GET沒有預檢選項在網絡選項卡要求在兩個 - 鉻49和Firefox 33

下面是Chrome瀏覽器使用GET請求的細節:

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8,ru;q=0.6 
Connection:keep-alive 
Host:local.adform.com 
Origin:http://localhost:7500 
Referer:http://localhost:7500/test-page.html 
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 

和相應的響應:

Access-Control-Allow-Headers:Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization 
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE 
Access-Control-Allow-Origin:* 
Content-Length:2 
Content-Type:text/plain; charset=utf-8 
Date:Wed, 03 Aug 2016 10:53:19 GMT 

任何思考爲什麼我的瀏覽器(S)不送預檢要求

+2

預檢並不總是完成,使用GET的可能性較小(如果有的話) - 請參閱[文檔](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests)當需要預檢時 –

+1

請參閱[本](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests)以獲取有關瀏覽器何時發出預檢請求的更多信息。 – robertklep

+0

@JaromandaX:謝謝你的評論。如果不需要預檢請求,那麼克服「同源」策略的(傳統)方法是什麼?情景是:我們創建了一個腳本,將合併到第三方網站,並將發送給我們_our_ cookies?據我所知,沒有預檢請求,瀏覽器不會向我們的服務器發送cookies,對吧? – ffriend

回答

7

正如評論員指出的,使用GET 瀏覽器並不總是發送預檢選項請求。如果確實需要預檢,一種使瀏覽器發送它的方法是設置自定義標題(例如「X-PINGOVER:pingpong」或其他)。請注意,該服務器還應該允許將此請求標頭添加到「訪問控制允許標頭」響應標頭


我的基本目標是通過餅乾與域a.coma.com服務器,而是從其他網站(S)b.com(常見的用例,這是跟蹤用戶在第三方網站)的頁面。事實證明,與請求一起發送的cookies還有一些工作涉及到。

客戶端(即在JavaScript中)需要啓用跨域請求並允許傳遞證書。例如。與jQuery下列要求爲我工作:

$.ajax({ 
    type: "GET", 
    url: "http://example.com", 
    xhrFields: { 
    withCredentials: true   // allow passing cookies 
    }, 
    crossDomain: true,    // force corss-domain request     
    success: function (data) { ... }, 
    error: function (request, error) { ... } 
}); 

服務器端一個需要設置2響應頭:

  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin: <requester origin>

其中<requester origin>是協議+主機+執行呼叫的網站的端口。請注意,通用*可能無法在許多瀏覽器中使用,因此服務器解析請求的標頭Referer並使用特定的允許來源進行響應是有意義的。

+0

有關更多信息,請參閱[MDN預檢請求](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests)文檔。 – styfle

+0

請務必注意,您的服務器可能不期望「X-PINGOVER」作爲標題,並且可能會返回錯誤。爲了解決這個問題,在你設置'Access-Control-Allow-Headers'值的服務器代碼中,包含'X-PINGOVER' – user2023861

相關問題