よく書かれたHTTPサーバーは、CORSプリフライト(OPTIONS
)リクエストを受け取ったときにどのステータスコードを返す必要がありますか?
200
、204
または、他の何か?
Originが許可されている(および対応するヘッダーが設定される)または許可されていない(およびCORSヘッダーが設定されないか、Originと一致しない)場合、ステータスコードは異なる必要がありますか?
その要点は、200
を使用するだけです。
もう少し一般的に:CORSプリフライトOPTIONS
リクエストに対して、他のOPTIONS
リクエストに対して返送するのと同じステータスコードを返送する必要があります。関連する仕様では、それ以上の要件や推奨事項はありません。
関連する仕様: https://fetch.spec.whatwg.org/ のFetch仕様は、CORSプロトコルの要件が定義されている場所であり、ステータスは範囲内であれば何でもかまいません200
-299
。
これは、 CORS-プリフライトフェッチアルゴリズム にあります。これには 「OKステータス」にできるというステップ :
CORSがrequestとresponseが成功を返し、responseをチェックする場合ステータスは
an ok status 、次のサブステップを実行します:…
そして、「OKステータス」が何であるかについては、仕様では次のように書かれています。
ok statusは、
200
から299
の範囲の包括的ステータスです。
ただし、Fetch仕様では、200
-299
内の特定のステータスは推奨されていません。
ここで関連する他の仕様は、HTTP 1.1仕様です。これには、すべてのHTTP応答ステータスコードのセマンティクスを定義するセクションがあり、その中に、 Successful 2xx コード。
そしてそのセクション内には 200 OK)の特定のセクション があり、これはこう言っています:
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プリフライトオプションへの応答は次のとおりです。
Access-Control-Allow-Methods
および Access-Control-Allow-Headers
応答ヘッダーが含まれます)それが 200 OK
がHTTP仕様で定義されているため、すぐに停止できます。
しかし、 そのセクションの残りの2xx
コード を読み通すと、OPTIONS
応答に対して意味をなさないコードのセマンティクスを確認できます。ただし、- 204 No Content
。
204 No Content
に関する限り、OPTIONS
応答にそれを使用してもwrongはありませんが、私が見る限りでは、実際にはありません。任意のポイント。それは:
OPTIONS
ペイロードの使用を定義していませんOPTIONS
のためにペイロード(コンテンツ)が戻ってくることを期待していません(そして戻ってきたペイロードでは何もしません)…私の知る限りでは、OPTIONS
応答で特定の204
ステータスコードを使用して、ペイロードがないことをクライアントに明示的に伝えることには実用的な目的はありません。
間違っている可能性がありますが、欠けているニュアンスがあります。しかし、私はそうは思いません。
Originが許可されている(および対応するヘッダーが設定される)または許可されていない(およびCORSヘッダーが設定されないか、Originと一致しない)場合、ステータスコードは異なる必要がありますか?
いいえ、違いはないと思います。とにかく使用できる200
または204
以外の標準定義のコードはわかりません。異なる場合は使用します。考えてみてください。これら2つのケースのステータスコードに違いがあるため、既存のクライアントコードはどのように異なるのでしょうか。
その質問に対する答えが「Nothing」である場合、私が見る限り、それを変更する意味はありません。
上記すべてを考えると、最終行は次のとおりです。CORSプリフライトOPTIONS
応答に200 OK
を送信するだけです。 200 OK
以外のコードを送信する必要はありません。