59

クロム 22 & サファリ 6。

次のコードを使用して、CORS 対応の S3 バケットを使用して、キャンバスで使用するために s3 から画像をロードします (主な目的として抽出を使用)。

<!-- In the html -->
<img src="http://s3....../bob.jpg" /> 

// In the javascript, executed after the dom is rendered
this.img = new Image();
this.img.crossOrigin = 'anonymous';
this.img.src = "http://s3....../bob.jpg";

私は次のことを観察しました:

  1. キャッシュを無効にする
  2. すべて正常に動作し、両方の画像が読み込まれます

次に、キャッシュを有効にして試してみます。

  1. キャッシュを有効にする
  2. DOM イメージが読み込まれ、キャンバス イメージが dom セキュリティ例外を作成する

コードの JavaScript 部分を変更してクエリ文字列を追加すると、次のようになります。

this.img = new Image();
this.img.crossOrigin = 'anonymous';
this.img.src = "http://s3....../bob.jpg?_";

キャッシュを完全に有効にしても、すべてが機能します。http プロキシを使用し、失敗した場合、画像が実際にはサーバーから要求されていないことを観察することで、キャッシングが問題であることに気付きました。

私が引き出さなければならない結論は、イメージキャッシュが元のリクエストヘッダーを保存しており、それが後続の CORS 対応リクエストに使用されているということです。同じオリジンポリシーに違反しているため、セキュリティ例外が生成されています。

これは意図した動作ですか?

編集:Firefoxで動作します。

Edit2: 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>
    </CORSRule>
</CORSConfiguration>

現在、ローカルボックスからテストしているだけなので、ワイドオープンを使用しています。これはまだ生産されていません。

Edit3: オリジンを指定するように cors ポリシーを更新しました

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://localhost:5000</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
    </CORSRule>
</CORSConfiguration>

確認済みの送信ヘッダー:

Origin  http://localhost:5000
Accept  */*
Referer http://localhost:5000/builder
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.3

着信ヘッダー:

Access-Control-Allow-Origin http://localhost:5000
Access-Control-Allow-Methods    GET
Access-Control-Allow-Credentials    true

キャンバスにロードするときにキャッシュを無効にしないと、クロムでも失敗します。

編集4:

失敗のケースでこれに気づきました。

送信ヘッダー:

GET /373c88b12c7ba7c513081c333d914e8cbd2cf318b713d5fb993ec1e7 HTTP/1.1
Host    amir.s3.amazonaws.com
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.91 Safari/537.4
Accept  */*
Referer http://localhost:5000/builder
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.3
If-None-Match   "99c958e2196c60aa8db385b4be562a92"
If-Modified-Since   Sat, 29 Sep 2012 13:53:34 GMT

着信ヘッダー:

HTTP/1.1 304 Not Modified
x-amz-id-2  3bzllzox/vZPGSn45Y21/vh1Gm/GiCEoIWdDxbhlfXAD7kWIhMKqiSEVG/Q5HqQi
x-amz-request-id    48DBC4559B5B840D
Date    Sat, 29 Sep 2012 13:55:21 GMT
Last-Modified   Sat, 29 Sep 2012 13:53:34 GMT
ETag    "99c958e2196c60aa8db385b4be562a92"
Server  AmazonS3

これは、dom によってトリガーされた最初の要求だと思います。ただし、それがjavascriptリクエストではないことはわかりません。

4

3 に答える 3

15

問題は、必要な CORS ヘッダーなしで、以前の要求から画像がキャッシュされていることです。したがって、キャンバスに対して再度要求すると、「crossorigin」が指定された状態で、ブラウザーはキャッシュされたバージョンを使用し、表示されません。必要なヘッダーを取得し、CORS エラーを発生させます。「?_」を URL に追加すると、これは別の URL であるため、ブラウザーはキャッシュを無視します。このスレッドを見てください: https://bugs.chromium.org/p/chromium/issues/detail?id=409090

Firefox やその他のブラウザには、この問題はありません。

于 2016-05-26T08:09:56.923 に答える
6

説明されている動作は、キャッシュ エントリ キーがターゲット URI であるため、論理的に見えます ( 7234 Hypertext Transfer Protocol (HTTP/1.1): Cachingを参照)。この問題を修正し、キャッシュを効果的に使用するには、イメージ ホスティング サーバーが両方のケースで同じ応答を返すようにする必要があります。

1 つのオプションは、ユーザー エージェントOriginが最初の要求でも HTTP ヘッダーを送信するようにすることです (キーを含む応答targetUriがまだキャッシュにない場合)。

<img src="targetUri" crossorigin="anonymous" />

もう 1 つのオプションは、リクエストにOriginHTTP ヘッダーが含まれているかどうかに関係なく、CORS 関連の HTTP ヘッダーを送信するようにイメージ ホスティング サーバーを構成することです。詳細については、S3 CORS を参照してください。StackOverflow で常に Vary: Originのディスカッションを送信してください。

Originまた、応答HTTP ヘッダーを使用して、応答が要求 HTTP ヘッダーに敏感であることをユーザー エージェントに通知することもできますVary。欠点は、おそらくユーザー エージェントがVaryヘッダーのみを (キャッシュ エントリ キーの一部としてではなく) 応答バリデーターとして使用し、ターゲット URI に対して単一の応答インスタンスのみを格納するため、キャッシュを効果的に使用することが難しくなることです。詳細については、Mark Nottingham によるThe State of Browser Caching の Revisited記事を参照してください。

于 2018-07-27T11:14:52.490 に答える
0

どの CORS 設定を適用していますか? この投稿AllowedOriginは、ワイルドカードが解析されることを示唆しています(逐語的に送信されるのではなく、これは文書化されていない動作のようです)。その後、Access-Control-Allow-Originヘッダー値は後続のリクエストのためにキャッシュされ、報告しているものと同様の問題が発生します。

于 2012-09-29T01:09:25.660 に答える