CORSドメイン間preflightリクエスト
2557 ワード
Access-Control-Allow-Origin
レスポンスヘッダフィールドを使用すると、非単純なリクエストに対してCORSメカニズムがドメイン間でpreflight(OPTIONSリクエスト)を最初に行い、このリクエストが成功した後に真のリクエストを送信することができることを知っています.この設計は、サーバがCORS規格について知っていることを確保し、CORSをサポートしていない古いサーバを保護することを目的としています.Wikipedia: https://upload.wikimedia.org/wikipedia/commons/c/ca/Flowchart_showing_Simple_and_Preflight_XHR.svg
単純なリクエスト
単純要求とは、具体的には、要求メソッドが単純メソッドであり、要求ヘッダが単純ヘッダであるHTTP要求をいう.具体的には、
GET
,HEAD
,POST
|を含む.Accept
,Accept-Language
,Content-Language
,およびapplication/x-www-form-urlencoded
,multipart/form-data
,text/plain
のいずれかの値を有するContent-Type
ヘッダを含む.非単純リクエストブラウザでは、カスタムヘッダ
x-foo
のHTTPリクエストを追加するなど、OPTIONSリクエストが最初に送信されます.var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.setRequestHeader('x-foo', 'bar');
xhr.send();
サーバは、成功した応答(2 xx)を必要とし、
Access-Control-Alow-Headers
にx-foo
を含める必要があります(単純なヘッダではないため).OPTIONS /origin-redirect-with-preflight 200
Access-Control-Allow-Headers:x-foo
Access-Control-Allow-Origin:http://index.com:4001
Connection:keep-alive
Content-Length:0
Access-Control-Request-Headers
Access-Clontrol-Request-Headersは、preflightリクエストに実際のリクエストに含まれるヘッダフィールドを識別するために使用され、preflightリクエスト自体はこれらのヘッダフィールドを送信しません.例えば、上記の要求における
Access-Control-Request-Headers
フィールドの値はx-foo
であるべきである.これらのフィールドは、対応するAccess-Control-Allow-Headers
応答ヘッダに含まれるべきである.200 preflightを返しても失敗します.XMLHttpRequest cannot load http://mid.com:4001/access-control-allow-origin-wildcard.
Request header field x-foo is not allowed by Access-Control-Allow-Headers in preflight response.
DNTリクエストヘッダについて
Safariステルスモードなどの一部のブラウザでは、要求に
DNT
ヘッダが追加されますが、ブラウザはpreflightを開始しません.このリクエストヘッダはブラウザが追加したものであるため、これについても知るべきである.従って、応答ヘッダにAccess-Control-Allow-Headers
を含める必要はなく、W 3 C Recommendationを参照して、以下の条件を満たすとpreflightをスキップすることができる.For request method there either is a method cache match or it is a simple method and the force preflight flag is unset. For every header of author request headers there either is a header cache match for the field name or it is a simple header.
注意:すべての
Author Header
が単純ヘッダであればスキップできます.ここでのDNT
は単純ヘッダではありませんが、User-Agent Header
に属します.CORSがリダイレクトされた後、この状況は複雑になることに注意し、リダイレクトCORSのドメイン間要求については、より詳細な議論がある.