jQueryを使用してS3からCloudFront CDNを介していくつかのSVGファイルをロードするWebページ(https://smartystreets.com/contact)があります。
Chromeでは、コンソールだけでなくシークレットウィンドウも開きます。次に、ページをロードします。ページがロードされると、通常、コンソールに次のような6〜8個のメッセージが表示されます。
XMLHttpRequest cannot load
https://d79i1fxsrar4t.cloudfront.net/assets/img/feature-icons/documentation.08e71af6.svg.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'https://smartystreets.com' is therefore not allowed access.
ページの標準的な再読み込みを複数回行っても、同じエラーが引き続き発生します。そうすればCommand+Shift+R
、ほとんどの、時にはすべての画像がXMLHttpRequest
エラーなしでロードされます。
時々、画像が読み込まれた後でも更新され、1つ以上の画像が読み込まれず、XMLHttpRequest
エラーが再び返されます。
S3とCloudfrontの設定を確認、変更、再確認しました。S3では、私のCORS設定は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
(注:最初は<AllowedOrigin>*</AllowedOrigin>
同じ問題しかありませんでした。)
CloudFrontでは、ディストリビューションの動作はHTTPメソッドを許可するように設定されていますGET, HEAD, OPTIONS
。キャッシュされたメソッドは同じです。Forward Headersは「Whitelist」に設定され、そのホワイトリストには「Access-Control-Request-Headers、Access-Control-Request-Method、Origin」が含まれます。
キャッシュレスブラウザーのリロード後に機能するという事実は、すべてがS3 / CloudFront側にあることを示しているようです。しかし、なぜ最初のページビューでコンテンツが配信されないのでしょうか?
macOS上のGoogle Chromeで作業しています。Firefoxは毎回ファイルを取得しても問題ありません。Operaはファイルを取得しません。Safariは、数回更新すると画像を取得します。
使用してcurl
も問題ありません:
curl -I -H 'Origin: smartystreets.com' https://d79i1fxsrar4t.cloudfront.net/assets/img/phone-icon-outline.dc7e4079.svg
HTTP/1.1 200 OK
Content-Type: image/svg+xml
Content-Length: 508
Connection: keep-alive
Date: Tue, 20 Jun 2017 17:35:57 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Last-Modified: Thu, 15 Jun 2017 16:02:19 GMT
ETag: "dc7e4079f937e83291f2174853adb564"
Cache-Control: max-age=31536000
Expires: Wed, 01 Jan 2020 23:59:59 GMT
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age: 4373
X-Cache: Hit from cloudfront
Via: 1.1 09fc52f58485a5da8e63d1ea27596895.cloudfront.net (CloudFront)
X-Amz-Cf-Id: wxn_m9meR6yPoyyvj1R7x83pBDPJy1nT7kdMv1aMwXVtHCunT9OC9g==
CloudFrontディストリビューションを削除して再作成することを提案する人もいます。かなり過酷で不便な修正のようです。
この問題の原因は何ですか?
更新:
ロードに失敗した画像から応答ヘッダーを追加します。
age:1709
cache-control:max-age=31536000
content-encoding:gzip
content-type:image/svg+xml
date:Tue, 20 Jun 2017 17:27:17 GMT
expires:2020-01-01T23:59:59.999Z
last-modified:Tue, 11 Apr 2017 18:17:41 GMT
server:AmazonS3
status:200
vary:Accept-Encoding
via:1.1 022c901b294fedd7074704d46fce9819.cloudfront.net (CloudFront)
x-amz-cf-id:i0PfeopzJdwhPAKoHpbCTUj1JOMXv4TaBgo7wrQ3TW9Kq_4Bx0k_pQ==
x-cache:Hit from cloudfront