クライアント側のS3アップロードが機能しているため、返されたオブジェクトにはCORSヘッダーがないため、バケットから返されるすべてのオブジェクトにS3がCORSヘッダーを設定するのに問題があります。
有効にしたポリシーは次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
オブジェクトURLの例 https://s3.amazonaws.com/captionable/meme/test
誰が間違っているのか知っていますか?
まず、すべてのリクエストでOrigin
ヘッダーを確認してください。 Origin
ヘッダーが送信されない場合、S3はaccess-control
ヘッダーを送信しません。S3はそれらを無関係であると見なしているためです(通常はそうです)。ブラウザ(CORSメカニズムが対象)は、XMLHTTPRequestを介してクロスオリジンHTTPリクエストを行うときに、Origin
ヘッダーを自動的に送信します。
img
で画像をロードする場合、crossorigin="anonymous"
属性を追加する必要があります。 crossorigin属性に関するMDNドキュメント を参照してください。これにより、XMLHTTPRequestの場合と同様に、ブラウザーはOrigin
要求ヘッダーを送信します。
サム・セリコフの答えに沿って、あなたは変える必要があるかもしれません
<AllowedOrigin>http://*</AllowedOrigin>
に
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
私はこれをテストしていません。
この回答に対するPaul Draperのコメント:キャッシュの問題に注意してください。ブラウザは、適切なAccess-Control
応答ヘッダーを含まないキャッシュされた応答を使用する場合があります。開発中に、キャッシュをクリアできます。本番環境では、以前に静的な方法で使用されていたリソースの新しいURLに切り替える必要があります。
また、<image>
タグを使用してこれに遭遇し、Myrne Stolの回答に従って、crossorigin=anonymous
タグをイメージタグに追加しました。 Origin
ヘッダーが実際にS3に送信されていることを確認しましたが、それでもAccess-Control-Allow-Origin
ヘッダーが応答で送信されていませんでした。
私は this SO answer に出会い、それを解決しました。S3configのAllowedOrigin
をこれに変更しました:
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
そして今、S3はアクセスヘッダーで応答します。わーい!
TLDR; (どこかで)CORSを必要とするリソースを要求するすべての画像または動画要素がcrossorigin="anonymous"
を使用していることを確認してください
キャンバスにエクスポートするビデオ要素でこの問題に遭遇しました。 CORSはS3で正しくセットアップされましたが、それでもエラーが発生し、ビデオの再生を拒否しました。
同じリソースを指す2番目のビデオ要素があり、そのビデオ要素にはcrossorigin="anonymous"
がありませんでした。したがって、2番目のビデオはaccess-control
ヘッダーを予期していなかったため正常に再生されましたが、サーバーレスポンスがキャッシュされ、キャッシュされたサーバーレスポンスにaccess-control header
がなかったため、最初のビデオの再生がブロックされました