web-dev-qa-db-ja.com

最善の方法:Access-Control-Allow-Origin Multiple Origin Domains

この質問は以前にここで尋ねられており、主に次の適切な回答が与えられています: Access-Control-Allow-Origin Multiple Origin Domains?

しかし、実施すべき承認された方法に関しては説明にギャップがあるようです。 W3ドキュメントを読むと、私にはガイダンスの矛盾があるように思われます。

まず、rightの方法で与えられた回答を見て、ホストサーバーが動的にエコーバックする必要があることを示す以前の回答の多くでそれを行う定義済みの「ホワイトリスト」に表示される場合、「Origin」が与えられます。 http://www.w3.org/TR/cors/#resource-implementation

ただし、使用される多くの回答と方法は、スペースで区切られたリストを暗示しており、許可する複数の「起源」を渡す方法としても使用できます。 http://www.w3.org/wiki/CORS_Enabled にある別のW3ドキュメントを見ると、ページの最初のセクションに次のような例があります。

 Access-Control-Allow-Origin: http://example.com:8080 http://blah.example.com http://foo.example.com

これらの2つの方法のうち、私は同様に喜んで組み込みますが、同時にリストアップする必要があるURLの大きなリストがあるかもしれないので、私はこれを最初から確実にやりたいと思いました。上記の2つの方法についての洞察をお持ちの方は、選択の決定を聞いて非常に感謝します。また、推奨される方法の決定的なガイドがある場合は逃したかもしれません。

30
JonnyIrving

これに関するドキュメントは、スペースで区切られたリストを持つ複数の起点を許可することを暗示しているように見えますが、それは実際に意味するものではありません。ここに、あなたの質問に対する最も決定的な答えとして集められるものがあります:Access-Control-Allow-Originヘッダーは、許可する限り、Originヘッダーと同じ値にする必要があります。

クライアントに送り返すのがホワイトリストではない理由は、技術的にはクライアントがスペースで区切られたオリジンのリストを送信して、サーバーがリクエストを検証できるようにするためです。発信元リストの目的は、要求が複数の発信元から送信された可能性があるためです(つまり、要求がドメイン間でリダイレクトされた)。 テストスイート は、スペース区切りのリストが(少なくともFirefoxによって)生成されない場合でも、さまざまなリダイレクトの可能性でこの動作を簡単に観察できるようにします。

これは、最初の リンクされたW3Cドキュメント で下に示されています:

Access-Control-Allow-Originヘッダーは、応答でOrigin要求ヘッダー、「*」、または「null」の値を返すことにより、リソースを共有できるかどうかを示します。 ABNF:

Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" Origin-list-or-null | 「*」

実際には、Origin-list-or-null生成はより制限されています。スペースで区切られたオリジンのリストを許可するのではなく、単一のオリジンまたは文字列「null」のいずれかです。

そして再び Originリストの定義 で。さらに、文字列「null」をOriginとして許可するかどうかを示しますが、とにかくOriginリストに埋め込むことはできません。

そのため、クライアントのOriginヘッダーに基づいて動的に生成されたヘッダーに固執し、それがホワイトリストに一致するかどうかを確認します。

38
Pluto

特定のWordの「例」を含むOriginを許可する必要がある場合、Apache vhostで次の設定を使用できます。

SetEnvIf Origin "^((?:https?:\/\/)?(?:[^@\n]+@)?(?:www.)?.example?.*)" REFERER=$0 
Header always set Access-Control-Allow-Origin %{REFERER}e env=REFERER

これにより、次のOrigin条件のいくつかが満たされます。

http://abc.bcd.example.com
https://www.example.in 
http://abcdexample.com 
many more

必要に応じて上記の正規表現を微調整できます。

0
Sandeep M