AWS: Как я могу разрешить несколько доменов в конфигурации S3 CORS?

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

Я следил за документацией здесь (первая конфигурация) , И нашел несколько других случайных ответов 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 заблокирован для загрузки политикой общего доступа к ресурсам: нет доступа Заголовок -Control-Allow-Origin 'присутствует на запрашиваемом ресурсе. Поэтому происхождение " http://example.dev " не разрешено.

и

  

Шрифт из источника " http: //CLOUDFRONTURL " заблокирован для загрузки политикой общего доступа к ресурсам: доступ Заголовок -Control-Allow-Origin 'имеет значение https://example.com , которое не равно указанному происхождение. Поэтому происхождение " http://example.dev " не разрешено.

7 голосов | спросил Dez 5 Jpm1000000pmTue, 05 Jan 2016 18:25:53 +030016 2016, 18:25:53

1 ответ


0

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

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

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

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

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

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

  

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

     

http: //docs. aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web

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

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

ответил Michael - sqlbot 7 Jam1000000amThu, 07 Jan 2016 05:22:53 +030016 2016, 05:22:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132