Назад | Перейти на главную страницу

CloudFront удаляет заголовок Access-Control-Expose-Headers, если задано Accept-Encoding.

Я пытаюсь заставить CloudFront обслуживать сжатый текстовый файл вместе с Content-Length: <bytes> и Access-Control-Expose-Headers: Content-Length заголовки, чтобы я мог отображать прогресс загрузки при использовании fetch().

У меня есть такая установка:

  1. Перед загрузкой в ​​S3 предварительно сожмите файлы с помощью gzip и установите Content-Encoding: gzip. (Использование автоматического сжатия CloudFront будет означать, что он сжимается на лету и Content-Length заголовок не будет установлен.)
  2. Настройки CORS для настройки S3 Allow-Control-Expose-Headers: Content-Length следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
    <ExposeHeader>Content-Length</ExposeHeader>
</CORSRule>
</CORSConfiguration>
  1. Настройка CloudFront с соответствующим S3 Origin и:
    • GET, HEAD, OPTIONS разрешены
    • Заголовок источника добавлен в белый список
    • "Автоматическое сжатие объектов" отключено

Используя эту конфигурацию, я получаю:

HTTP/1.1 200 OK
x-amz-id-2: ...
x-amz-request-id: ...
Date: Sat, 03 Aug 2019 06:28:41 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Expose-Headers: Content-Length
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Last-Modified: Sat, 03 Aug 2019 05:32:02 GMT
ETag: "6483b10f491dc607412899efad695a04"
Content-Encoding: gzip
x-amz-version-id: ...
Accept-Ranges: bytes
Content-Type: text/plain; charset=utf-8
Content-Length: 559354
Server: AmazonS3
HTTP/2 200
content-type: text/plain; charset=utf-8
content-length: 559354
date: Sat, 03 Aug 2019 06:05:26 GMT
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD
access-control-expose-headers: Content-Length
last-modified: Sat, 03 Aug 2019 05:32:02 GMT
etag: "6483b10f491dc607412899efad695a04"
content-encoding: gzip
x-amz-version-id: ...
accept-ranges: bytes
server: AmazonS3
vary: Origin
age: 1572
x-cache: Hit from cloudfront
via: 1.1 xxxxx.cloudfront.net (CloudFront)
x-amz-cf-pop: ...
x-amz-cf-id: ...
HTTP/2 200
content-type: text/plain; charset=utf-8
content-length: 559354
date: Sat, 03 Aug 2019 05:39:50 GMT
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD
last-modified: Sat, 03 Aug 2019 05:32:02 GMT
etag: "6483b10f491dc607412899efad695a04"
content-encoding: gzip
x-amz-version-id: ...
accept-ranges: bytes
server: AmazonS3
vary: Origin
age: 3239
x-cache: Hit from cloudfront
via: 1.1 xxxx.cloudfront.net (CloudFront)
x-amz-cf-pop: ...
x-amz-cf-id: ...

Обратите внимание, что access-control-expose-headers: Content-Length заголовок удаляется из заголовков ответов CloudFront просто потому, что мы установили Accept-Encoding: gzip.

(Также обратите внимание, что S3 с радостью вернет его, даже если Accept-Encoding: gzip установлено.)

Есть ли способ заставить CloudFront сохранить Access-Control-Expose-Headers заголовок, когда запрос имеет Accept-Encoding: gzip?

Думаю, я нашел ответ. Необходимо добавить Accept-Encoding в набор заголовков из белого списка в поведении кеша CloudFront. Выполнение этого с последующим запуском аннулирования, похоже, исправит это.