2016-06-09 59 views
1

我看到有CORS奇怪的事情,我試圖確認它是否是一個錯誤或什麼...CORS預檢沒有發生持續

基本上,我有一個網站,www.example.com這使得多個POST請求到log.example.com做日誌記錄。由於log.example.com是一個不同的域,CORS是有效的。

在大多數情況下,我會看到預檢OPTIONS請求,然後是POST請求。然而,在某些情況下,我只看到POST,沒有前面的選項 - 基本上是這樣的:

OPTIONS 
POST 
...intervening requests to www... 
OPTIONS 
POST 
POST 
...intervening requests to www... 
POST 
...intervening requests to www... 
OPTIONS 
POST 

的OPTIONS請求沒有返回的訪問控制,最大年齡頭(他們也許應該,但這是另一回事),所以OPTIONS響應不應該被瀏覽器緩存。所有的OPTIONS請求返回一個200,所有的POSTS返回一個202.有時會有干預請求,有時候不會。所有OPTIONS請求都傳遞完全相同的標題,並且響應返回完全相同的Access-Control- *響應標頭組合。 POST請求也是如此。我沒有(容易)訪問正在發出POST請求的JS(我的意思是,我可能找到它,但它被混淆了),但我認爲它不應該有任何區別 - 我很確定他們只是基本的'XHR請求。

fetch spec開始,如果Access-Control-Max-Age未被傳遞,即使條目已添加到預檢緩存中,也應立即將其刪除。或者可能是因爲第二次POST在第一次POST(它跟在OPTIONS請求之後)的一秒鐘內發生,那麼預檢緩存中有一個未到期的條目?

+0

您是否知道這些OPTIONS跳過請求是來自不同的UA /瀏覽器引擎,還是您只從一個UA中看到該模式?因爲它聽起來像它可能只是一個瀏覽器錯誤。 – sideshowbarker

+0

@sideshowbarker,我只在Chrome瀏覽器上看過(51.0.2704.79米) - 我還沒有在其他瀏覽器上測試過。我知道CORS測試套件非常廣泛,所以我懷疑計時錯誤。根據提取規範(5.8):「自存儲條目以來,必須在max-age字段中指定的秒數之後從[CORS預檢緩存]中刪除條目。」它看起來像條目可能總是被添加到緩存(5.7.7.15和5.7.7.17),即使max-age沒有被傳遞。即使他們名義上從緩存中'立即'被驅逐出境,他們可能會在第二次POST後足夠長的時間? – roryhewitt

回答

1

並非所有的POST請求都被預檢(POST是CORS安全列表的方法)。它取決於請求中包含的標題。因此,如果沒有頭文件在CORS安全列表請求頭範圍之外,則不會進行預檢。

+0

嗨安妮,我想你可能會迴應:)所有的POST請求都是完全相同的,頭文件明智的,它們都包含Content-Type:application/json,它不是CORS安全列表的請求頭(儘管我認爲它可能應該是:)......奇怪的是,一些預檢和一些沒有,我看不出他們之間的任何區別,除了有效載荷本身(這只是略有不同)。 – roryhewitt