ローカルで実行しているサーバーにAJAXリクエストをPOSTしています。つまり、.
xhr.open("POST", "http://localhost:9000/context/request");
xhr.addHeader(someCustomHeaders);
xhr.send(someData);
このJavaScriptが実行されているページは、localhost:9000からも提供されています。つまり、これは完全に同じ元のリクエストのように見えます。
ただし、なんらかの理由で、Google Chrome=は常に結果のリクエストにOriginヘッダーを設定するため、サーバーはCORSリクエストであるという誤った仮定に基づいてリクエストをブロックします。
これはFirefoxでは発生しません。
また、FirefoxもChrome=もOPTIONSプリフライトリクエストを送信していないため、混乱を招きます。Originヘッダーとカスタムヘッダーがサーバーで許可されていることを確認するために、最初のプリフライトなしでOriginヘッダーを設定するのはなぜですか。
このケースで何が起こっているのか誰か知っていますか? CORS仕様を誤解していますか?
ChromeとSafariは、同一の元のPOST/PUT/DELETEリクエストにOrigin
ヘッダーを含めます(同じ元のGETリクエストにはOriginヘッダーがありません)。 Firefoxは、同一オリジンリクエストにOrigin
ヘッダーを含めません。ブラウザーは、同じ起源の要求でCORS応答ヘッダーを期待しないため、CORSヘッダーがあるかどうかに関係なく、同じ起源の要求に対する応答がユーザーに送信されます。
Host
ヘッダーを確認することをお勧めします。Origin
ヘッダーのドメインと一致する場合は、リクエストをCORSとして処理しないでください。ヘッダーは次のようになります。
Host: example.com
Origin: http://example.com
Origin
にはスキーム(http/https)、ドメイン、およびポートが含まれ、Host
にはドメインとポートのみが含まれることに注意してください。
RFC 6454-によると、Web Origin Concept-Originの存在same-Originリクエストを含むすべてのHTTPリクエストに対して実際に合法です:
http://tools.ietf.org/html/rfc6454#section-7.
「ユーザーエージェントは、HTTPリクエストにOriginヘッダーフィールドを含めることができます。」