Налаштування Access-Control-Allow-Origin на Cloudfront


15

У мене виникають проблеми з обслуговуванням статичних об’єктів для Firefox за допомогою AWS Cloudfront.

Chrome працює ідеально, але Firefox повертає помилку CORS.

Якщо я виконую curl, я отримую:

HTTP/1.1 200 OK
Content-Type: application/x-font-opentype
Content-Length: 39420
Connection: keep-alive
Date: Mon, 11 Aug 2014 21:53:50 GMT
Cache-Control: public, max-age=31557600
Expires: Sun, 09 Aug 2015 01:28:02 GMT
Last-Modified: Fri, 08 Aug 2014 19:28:05 GMT
ETag: "9df744bdf9372cf4cff87bb3e2d68fc8"
Accept-Ranges: bytes
Server: AmazonS3
Age: 2743
X-Cache: Hit from cloudfront
Via: 1.1 c445b20dfbf3128d810e975e5d84e2cd.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ...

Який, на мою думку, потрібен заголовок:

Access-Control-Allow-Origin: *

Хтось може мені допомогти? Чому це проблема на Firefox, а не на Chrome? Як я можу це вирішити?

Відповіді:


18

Перш за все, вам потрібно переконатися, що ви маєте заголовок білого списку:

Якщо ви хочете, щоб CloudFront дотримувався налаштувань спільного використання ресурсів, налаштуйте CloudFront для перенаправлення заголовка Origin до свого джерела.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-cors

Також дивіться: http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

До речі, є кілька подібних запитань щодо сервера default / stackoverflow та багато відповідей.


4

Це трохи складніше, ніж свідчить прийнята відповідь.

Підтримка CORS при використанні Cloudfront + S3 реально реалізована в S3, і вона працює так згідно Amazon:

Заголовок Origin запиту повинен відповідати елементу AllowedOrigin.

Метод запиту (наприклад, GET або PUT) або заголовок методу управління доступом у випадку, якщо запит OPTIONS перед передпольотом повинен бути одним із дозволених методів.

Кожен заголовок, зазначений у заголовку запиту Access-Control-Request-Headers у запиті перед польотом, повинен відповідати елементу AllowedHeader.

Це має сенс, що може не бути зрозумілим, що якщо клієнт не надсилає заголовка Origin, то ця обробка взагалі не виконується. І ми використовуємо Cloudfront попереду, який, якщо ви просто розміщуєте статичні активи, ви, ймовірно, налаштували його ігнорувати всі заголовки під час кешування. Тому якщо перший запит до кожного файлу з конкретного крайового вузла не містить заголовка Origin, він буде кешувати відповідь без заголовка Access-Control-Allow-Origin.

Результат полягає в тому, що перший вхідний запит визначатиме, які заголовки повертаються для всіх запитів, поки не закінчиться кеш.

Існує кілька способів виправити це.

  • Налаштуйте облачну область для кешування умовного кешування на основі заголовка "Походження".

Це чудово працює, якщо ви очікуєте лише кількох або одного походження, але в іншому випадку співвідношення кешування може стати поганим.

  • Використовуйте Lambda @ edge для примусового встановлення заголовків, це можна зробити лише один раз для кожного запиту про вихід (S3).

Повністю гнучка, але додає накладні витрати та вартість.

  • Зробіть заставку "замінити" заголовок "Походження" на манекенне значення для кожного запиту.

Це дійсно корисно лише у випадку "Access-Control-Allow-Origin: *", і це трохи хак, але це, мабуть, найкраще поточне рішення при розміщенні статичних активів на cloudfront + S3.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.