2016-01-05 3 views
6

У меня возникла проблема на многих моих сайтах, которые полагаются на S3 как источник для Cloudfront. Однако у меня возникают проблемы с разрешением нескольких доменов (вместо глобального *).AWS: Как разрешить несколько доменов в конфигурации S3 CORS?

Я следовал документации here (первая конфигурация). И нашел несколько других случайных ответов SO или форума здесь и там (вторая конфигурация)

Любая помощь приветствуется.

У меня есть установки 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> 
     <AllowedMethod>HEAD</AllowedMethod> 
     <AllowedMethod>DELETE</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>Authorization</AllowedHeader> 
    </CORSRule> 
    <CORSRule> 
     <AllowedOrigin>http://example.com</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
    <CORSRule> 
     <AllowedOrigin>https://staging.example.com</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
    <CORSRule> 
     <AllowedOrigin>http://example.dev</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

И

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>https://example.com</AllowedOrigin> 
     <AllowedOrigin>http://example.com</AllowedOrigin> 
     <AllowedOrigin>https://staging.example.com</AllowedOrigin> 
     <AllowedOrigin>http://example.dev</AllowedOrigin> 
     <AllowedMethod>GET</AllowedMethod> 
     <AllowedMethod>HEAD</AllowedMethod> 
     <AllowedMethod>DELETE</AllowedMethod> 
     <AllowedMethod>PUT</AllowedMethod> 
     <AllowedMethod>POST</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>Authorization</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

я получаю ошибку шрифта происхождения на всех сайтах кромеhttps://example.com:

Шрифт от источника 'http://CLOUDFRONTURL' был заблокирован от загрузки по правилам совместного использования ресурсов Cross-Origin: заголовок Access-Control-Allow-Origin отсутствует на запрошенном ресурсе. Origin 'http://example.dev', следовательно, не допускается.

И

шрифт из происхождения 'http://CLOUDFRONTURL' был заблокирован нагружении политики Cross-Origin совместного использования ресурса: 'Access-Control-Allow-Origin' заголовок имеет значение 'https://example.com', что не соответствует заданному происхождению. Origin 'http://example.dev', следовательно, не допускается.

+0

Является ли дистрибутив CloudFront настроенным на белый список заголовка 'Origin'? –

+0

@ Michael-sqlbot Я не знаю, где это проверить. Редактирование Origin не дает ничего, связанного с заголовком запроса заголовка whitelisting. – Dez

+0

Это настройка поведения кэша, а не настройка источника; см. http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web –

ответ

3

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

Для ответа, который должен быть подан из кеша, он должен быть возвращен в ответ на предыдущий запрос, в котором участвуют точно такие же заголовки запросов.

Это связано с тем, что в принципе, по крайней мере, разные заголовки могут инициировать различное поведение сервера, а хорошо подобранный кеш не имеет права предполагать иное.

Для увеличения кэшируемости объектов без ущерба для его способности служить правильных ответов (то есть, идентичный ответ сервер происхождения возвратил бы для данного запроса), CloudFront полосы почти из заголовков запроса перед отправкой запроса на происхождение и использует разделенную версию запроса при выполнении поиска в кеше.

Когда исходный сервер является источником «Custom» (то есть не S3), вы можете выбрать, какие заголовки пересылать на исходный сервер.

Но когда исходный сервер S3, у вас все еще есть выбор, но есть только три, которые могут быть переадресованы ... и все они связаны с CORS.

[С S3 происхождения] можно настроить CloudFront пересылать и кэшировать объекты, основанные только на трех заголовков: Access-Control-Request-Headers, Access-Control-Request-Method и Origin. Пересылка этих заголовков позволяет CloudFront распространять контент для веб-сайтов, которые разрешены для совместного использования ресурсов по нескольким ресурсам (CORS). Вы не можете настроить CloudFront для пересылки пользовательских заголовков на Amazon S3.

Если заголовок Origin:, по крайней мере, не получает перенаправлены, то S3 не будет в состоянии реагировать на него. Включение пересылки этого заголовка означает, что не только S3 увидит его и потенциально изменит его ответ из-за конфигурации CORS в ковше, но также и то, что каждый вариант Origin: - для одного и того же объекта - приведет к другому (и правильный) ответ возвращается S3 и кэшируется для будущих запросов соответствия CloudFront.

Пользовательские заголовки не могут быть перенаправлены на S3 CloudFront, потому что это нецелесообразно - поскольку S3 хранит статический контент, ответы не будут отличаться от других заголовков, поэтому их пересылка будет бессмысленной и приведет к уменьшению попадания в кеш , причем многие (предположительно) разные ответы кэшируются, но только обслуживаются в ответ на запросы, которые сопровождаются одинаковыми заголовками.

Смежные вопросы