После некоторой настройки мне кажется, что это работает без взлома строки запроса. Подробнее здесь: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
Я собираюсь пройти всю настройку, чтобы было легко увидеть, что я сделал, надеюсь, это поможет другим.
Общая информация: я использую приложение Rails, в котором есть гем asset_sync для размещения ресурсов на S3. Сюда входят шрифты.
В консоли S3 я щелкнул по своей корзине, свойствам и «редактировать конфигурацию cors», здесь:
Внутри текстового поля у меня есть что-то вроде:
<?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>
Затем на панели Cloudfront ( https://console.aws.amazon.com/cloudfront/home ) я создал дистрибутив, добавил источник, указывающий на мою корзину S3.
Затем добавил поведение для пути по умолчанию, чтобы указать на исходную точку на основе S3, которую я установил. Я также нажал на заголовки белого списка и добавил Origin
:
Сейчас происходит следующее, что я считаю правильным:
1) Убедитесь, что заголовки S3 установлены правильно
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) Убедитесь, что Cloudfront работает с заголовками
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==
(Обратите внимание, что вышеупомянутое было пропущено из облачного интерфейса, потому что эти файлы кэшируются в течение 180 секунд, но то же самое работало с обращениями)
3) Нажмите cloudfront с другим источником (но тем, который разрешен в CORS для ведра S3) - Access-Control-Allow-Origin
не кэшируется! ура!
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==
Обратите внимание, что домен был успешно изменен без взлома строки запроса.
Когда я меняю заголовок Origin, кажется, что всегда X-Cache: Miss from cloudfront
при первом запросе появляется сообщение, а затем я получаю ожидаемыйX-Cache: Hit from cloudfront
PS Стоит отметить, что при выполнении curl -I (заглавная I) НЕ будут отображаться заголовки Access-Control-Allow-Origin, поскольку это только HEAD, я делаю -i, чтобы сделать его GET и прокручивать вверх.
Access-Control-Allow-Origin
заголовок кэшируется и делает CORS недействительным, когда последующий запрос выполняется через другой поддомен?