2017-09-03 36 views
12

編寫良好的HTTP服務器在獲得CORS預檢(OPTIONS)請求時應返回哪種狀態碼?什麼是適用於CORS預檢請求的狀態碼?

200204還是別的?

在情況允許的情況下(和相應的頭文件將被設置)或不被允許(並且CORS頭文件不會被設置或不會與原文匹配),狀態代碼應該不同嗎?

回答

10

它的要點是,只需使用200

稍微更一般一點:您應該只發回CORS預檢OPTIONS請求的相同狀態碼,以便您發送請求返回任何其他OPTIONS請求。相關規格不要求或推薦更多的東西。

就相關規範而言:https://fetch.spec.whatwg.org/的提取規範是定義CORS協議的要求的地方,它表示狀態可以是200 - 299範圍內的任意值。

CORS-preflight fetch algorithm,其中有a step saying it can be any 「ok status"是:

如果CORS支票要求響應回報的成功和響應的地位是
ok status,執行這些子步驟:...

至於什麼是「ok狀態」,規範說:

OK狀態範圍爲200299,包括任何狀態。

除此之外,Fetch規範不建議200 - 299中的任何特定狀態。

這裏的其他相關規範是HTTP 1.1規範,它有一個定義所有HTTP響應狀態代碼的語義的部分,並且在其中代碼爲a specific section that defines Successful 2xx

這部分中有,其中這樣說:

The 200 (OK) status code indicates that the request has succeeded. 
The payload sent in a 200 response depends on the request method. 
For the methods defined by this specification, the intended meaning 
of the payload can be summarized as: 
… 
OPTIONS a representation of the communications options; 

所以到CORS預檢選項的迴應只是需要:

這就是HTTP規範定義的200 OK,所以你可以在那裏停下來。

但是,如果您通讀了the rest of the 2xx codes in that section,則可以確認其中沒有任何一個語義的語義對於OPTIONS響應是有意義的,但204 No Content除外。

現在儘可能204 No Content去,也沒什麼錯使用它OPTIONS迴應,但據我所看到的,也沒有真正的任何一點。這是因爲:

  • 不像一些其他的方法,HTTP規範在實踐中沒有定義使用了一個OPTIONS有效載荷
  • 因此,客戶不要指望任何有效載荷(內容)回來爲OPTIONS(和不會做與沒回來任何有效載荷的任何東西)

...所以據我可以看到有在使用的OPTIONS響應特定204狀態代碼明確地告訴客戶沒有有效載荷沒有任何實際用途。

雖然可能我可能是錯的,但我還是有一些細微之處。但我不這麼認爲。

在情況允許的情況下(和相應的頭文件將被設置)或不被允許(並且CORS頭文件不會被設置或不會與原點匹配),狀態代碼應該不同嗎?

不,我不認爲它應該是不同的。我不知道您可以使用200204以外的其他標準定義代碼 - 但無論如何,規範並不要求它有任何不同,如果是這樣,則不需要定義任何不同的用法。並考慮一下:由於這兩種情況的狀態代碼有什麼不同,現有的客戶代碼會做什麼不同?

如果對這個問題的答案是,「Nothing」,據我所知,沒有意義使它不同。


鑑於上述所有的底線是:只需發送200 OK爲CORS預檢OPTIONS響應。發送除200 OK以外的任何代碼都不是必需的或有用的。

相關問題