Nach einigen Optimierungen scheint dies ohne den Abfragezeichenfolgen-Hack zu funktionieren. Weitere Informationen finden Sie hier: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
Ich werde mein gesamtes Setup durchgehen, damit ich leicht sehen kann, was ich getan habe. Hoffentlich hilft dies anderen.
Hintergrundinformationen: Ich verwende eine Rails-App mit dem Juwel "Asset_Sync", um Assets in S3 zu platzieren. Dies schließt Schriftarten ein.
In der S3-Konsole habe ich hier auf meinen Bucket, Eigenschaften und 'Cors-Konfiguration bearbeiten' geklickt:
Im Textbereich habe ich so etwas wie:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://*.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Dann habe ich im Cloudfront-Bereich ( https://console.aws.amazon.com/cloudfront/home ) eine Distribution erstellt und einen Origin hinzugefügt, der auf meinen S3-Bucket
verweist
Anschließend wurde ein Verhalten für einen Standardpfad hinzugefügt, der auf das S3-basierte Ursprungs-I-Setup verweist. Ich habe auch auf Whitelist-Header geklickt und hinzugefügt Origin
:
Was jetzt passiert, ist das Folgende, was ich für richtig halte:
1) Überprüfen Sie, ob die S3-Header richtig eingestellt sind
curl -i -H "Origin: https://example.com" https://s3.amazonaws.com/xxxxxxxxx/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
x-amz-id-2: Ay63Qb5uR98ag47SRJ91+YALtc4onRu1JUJgMTU98Es/pzQ3ckmuWhzzbTgDTCt+
x-amz-request-id: F1FFE275C0FBE500
Date: Thu, 14 Aug 2014 09:39:40 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Content-Type: application/x-font-ttf
Content-Length: 12156
Server: AmazonS3
2) Überprüfen Sie, ob Cloudfront mit den Headern funktioniert
curl -i -H "Origin: https://example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 09:35:26 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 77bdacfea247b6cbe84dffa61da5a554.cloudfront.net (CloudFront)
X-Amz-Cf-Id: cmCxaUcFf3bT48zpPw0Q-vDDza0nZoWm9-_3qY5pJBhj64iTpkgMlg==
(Beachten Sie, dass das oben Genannte ein Fehler von der Cloudfront war, da diese Dateien 180 Sekunden lang zwischengespeichert werden, aber dasselbe funktionierte bei Treffern.)
3) Schlagen Sie die Cloudfront mit einem anderen Ursprung an (aber einem, der auf CORS für den S3-Bucket zulässig ist) - der Access-Control-Allow-Origin
wird nicht zwischengespeichert! Yay!
curl -i -H "Origin: https://www2.example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 10:02:33 GMT
Access-Control-Allow-Origin: https://www2.example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 ba7014bad8e9bf2ed075d09443dcc4f1.cloudfront.net (CloudFront)
X-Amz-Cf-Id: vy-UccJ094cjdbdT0tcKuil22XYwWdIECdBZ_5hqoTjr0tNH80NQPg==
Beachten Sie oben, dass die Domain ohne einen Hack für Abfragezeichenfolgen erfolgreich geändert wurde.
Wenn ich den Origin-Header ändere, scheint es immer eine X-Cache: Miss from cloudfront
bei der ersten Anfrage zu geben, danach erhalte ich die erwarteteX-Cache: Hit from cloudfront
PS Es ist erwähnenswert, dass bei Curl -I (Großbuchstabe I) die Header Access-Control-Allow-Origin NICHT angezeigt werden, da es sich nur um einen HEAD handelt. Ich mache -i, um es zu einem GET zu machen und nach oben zu scrollen.
Access-Control-Allow-Origin
Header wird zwischengespeichert und macht CORS ungültig, wenn eine nachfolgende Anforderung über eine andere Subdomain erfolgt?