19

ローカルで実行されているサーバーに 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 ヘッダーと Custom ヘッダーがサーバーによって許可されていることを確認するために、最初にプリフライトせずに Origin ヘッダーを設定するのはなぜですか?

この場合、何が起こっているのか知っている人はいますか?CORS 仕様を誤解していませんか?

4

2 に答える 2

33

ChromeとSafariには、Origin同一生成元のPOST / PUT / DELETEリクエストにヘッダーが含まれています(同一生成元のGETリクエストにはOriginヘッダーがありません)。OriginFirefoxには、同一生成元リクエストのヘッダーは含まれていません。ブラウザは、同じ発信元のリクエストでCORS応答ヘッダーを期待しないため、同じ発信元のリクエストへの応答は、CORSヘッダーがあるかどうかに関係なく、ユーザーに送信されます。

ヘッダーを確認することをお勧めします。ヘッダーHost内のドメインと一致する場合はOrigin、リクエストをCORSとして扱わないでください。ヘッダーは次のようになります。

Host: example.com
Origin: http://example.com

Originスキーム(http / https)、ドメイン、およびポートが含まれますが、ドメインとポートのみが含まれることに注意してくださいHost

于 2013-03-20T02:10:30.407 に答える
19

RFC 6454 - The Web Origin Concept -によると、Origin の存在は、同じオリジンのリクエストを含むすべての HTTP リクエストに対して実際に合法です。

https://www.rfc-editor.org/rfc/rfc6454#section-7.3

「ユーザー エージェントは、任意の HTTP 要求に Origin ヘッダー フィールドを含めることができます。」

于 2013-05-08T13:43:21.623 に答える