Po pewnych poprawkach wydaje mi się, że udało mi się to bez hackowania ciągu zapytania. Więcej informacji tutaj: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
Przejdę przez całą moją konfigurację, aby łatwo było zobaczyć, co zrobiłem, mam nadzieję, że pomoże to innym.
Informacje ogólne: Używam aplikacji Rails, która ma klejnot asset_sync do umieszczania zasobów na S3. Obejmuje to czcionki.
W konsoli S3 kliknąłem mój zasobnik, właściwości i „edytuj konfigurację cors”, tutaj:
W polu tekstowym mam coś takiego:
<?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>
Następnie w panelu Cloudfront ( https://console.aws.amazon.com/cloudfront/home ) utworzyłem dystrybucję, dodałem Origin, które wskazywało na moje wiadro S3
Następnie dodano zachowanie dla domyślnej ścieżki, aby wskazywało na punkt początkowy oparty na S3, który ustawiłem. To, co też zrobiłem, to kliknięcie nagłówków białej listy i dodanie Origin
:
To, co dzieje się teraz, jest następujące, co uważam za słuszne:
1) Sprawdź, czy nagłówki S3 są ustawione prawidłowo
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) Sprawdź, czy Cloudfront działa z nagłówkami
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==
(Zauważ, że powyższy błąd był chybiony przez Cloudfront, ponieważ te pliki są buforowane przez 180 sekund, ale to samo działało na trafieniach)
3) Hit cloudfront z innym źródłem (ale takim, które jest dozwolone na CORS dla zasobnika S3) - Access-Control-Allow-Origin
nie jest buforowane! 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==
Zauważ powyżej, że domena została pomyślnie zmieniona bez hackowania ciągu zapytania.
Kiedy zmieniam nagłówek Origin, wydaje się, że zawsze pojawia X-Cache: Miss from cloudfront
się na pierwszym żądaniu, a potem otrzymuję oczekiwaneX-Cache: Hit from cloudfront
PS Warto zauważyć, że podczas wykonywania curl -I (duże I) NIE pokaże nagłówków Access-Control-Allow-Origin, ponieważ jest to tylko HEAD, robię -i, aby uczynić go GET i przewinąć w górę.
Access-Control-Allow-Origin
nagłówek jest zapisywany w pamięci podręcznej i unieważnia mechanizm CORS, gdy kolejne żądanie jest wysyłane za pośrednictwem innej subdomeny?