Почему CloudFront изменяет ответ заголовков CORS на основе Accept-Encoding? - программирование
Подтвердить что ты не робот

Почему CloudFront изменяет ответ заголовков CORS на основе Accept-Encoding?

Я пытаюсь заставить CORS нормально работать с Amazon S3 + CloudFront.

После настройки моей конфигурации CORS она работает нормально:

$ curl -H "Origin: https://app.close.io" -I "https://d4389n07pf8cq.cloudfront.net/built/app.9e1f9ee9.js" -s | grep Access  
Access-Control-Allow-Origin: https://app.close.io
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true

Но когда ресурс запрашивается с помощью Accept-Encoding: gzip, заголовки CORS не возвращаются должным образом.

$ curl -H "Origin: https://app.close.io" -H "Accept-Encoding: gzip" -I "https://d4389n07pf8cq.cloudfront.net/built/app.9e1f9ee9.js" -s | grep Access 
(nothing)

Почему это?

Моя конфигурация CORS выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>https://app.close.io</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
        <AllowedHeader>Content-*</AllowedHeader>
        <AllowedHeader>Host</AllowedHeader>
        <AllowedHeader>Accept-Encoding</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

(Я также попробовал конфигурацию CORS с удаленным заголовком Accent-Encoding.)

Сам объект S3 является gzipped и имеет "Метаданные" Content-Encoding: gzip, Cache-Control: public, max-age=31536000 и Content-Type: application/javascript.

Я не понимаю, почему CloudFront + S3 CORS не работает должным образом при запросе gzip.

4b9b3361

Ответ 2

Я думаю, что проблема, с которой вы сталкиваетесь, вызвана отсутствием поддержки CloudFront для CORS. В это время они не поддерживают Vary в заголовке Origin, поэтому CloudFront предоставил старый кешированный ответ, у которого не было правильных заголовков CORS для вашего второго запроса (с accept encoding: gzip).

Посмотрите эту тему на форуме AWS для обхода этой недостающей поддержки CORS:

https://forums.aws.amazon.com/message.jspa?messageID=422504#422532

Ответ 3

Это может помочь вам, поскольку я успешно получил CORS для работы на S3 и Cloudfront. Я заметил, что в первый раз S3 и Cloudfront вытаскивают файлы, которые в значительной степени кэшируют заголовки, даже после того, как вы их изменили. Убедитесь, что включено управление версиями параметров запроса, и вы можете добавить ?v=1 в конец вашего файла. Это "обновление" заголовков для нас и CORS было хорошим.