Amazon Cloudfront с перенаправлением S3

10

Я пытаюсь сделать что-то, что должно быть относительно простым - я хочу настроить несколько доменов и поддоменов для перенаправления в основной домен для нашего сайта, но я хочу разместить перенаправления в Cloudfront. Все работает, кроме перенаправления корневого пути - это дает мне файл XML, частично описывающий корзину S3.

Фон

S3

S3 позволяет вам настроить контейнер для перенаправления , например:

S3 с настройкой перенаправления всех запросов

Тестируя это, веб-конечная точка (brass9-com.s3-website-us-west-1.amazonaws.com) делает то, что должна - она ​​перенаправляет на brass9.com. Хорошо.

CloudFront

Cloudfront позволяет вам указывать на корзину S3, но то, как он предлагает вам это делать, неверно - вместо того, чтобы указывать на корзину по ее имени, например, brass9-com.s3.amazonaws.com, вам нужно использовать веб- конечную точку выше. Кроме этого вы можете оставить все по умолчанию и получить хорошее поведение перенаправления. Таким образом, путь, такой как www.brass9.com/portfolio, правильно перенаправляет туда, куда он должен. Тоже хорошо.

Проблема - перенаправление корневого домена

Одна вещь, которая затем не работает, это перенаправление с простого www.brass9.com . Вместо перенаправления вы получите странный результат:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>brass9-com</Name><Prefix></Prefix>
<Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated>
</ListBucketResult>

ХОРОШО... . Так что это не совсем неожиданно - потому что нет корневого объекта по умолчанию. Но какой корневой объект по умолчанию я мог бы указать, чтобы предотвратить такое поведение? Как называется объект перенаправления S3, если таковой имеется, на который мне нужно указать? Или есть какая-то другая правильная конфигурация, или это просто ошибка в взаимодействии Cloudfront и S3, которую Amazon нужно исправить?

Известное нерабочее решение: корневой объект по умолчанию

Можно указать корневой объект по умолчанию для index.html, но он не помогает никому - он просто меняет проблему. URL-адрес Cloudfront вместо этого перенаправляет на /index.html на главном сайте, который является 404 (мы не используем файл index.html, это сайт, управляемый инфраструктурой на стороне сервера). Я мог бы разместить index.html на сервере, но это в первую очередь сводит на нет небольшой выигрыш в скорости использования Cloudfront.

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

В одном вопросе задается нечто подобное, но по какой-то причине возвращается пустой 0-байтовый ответ вместо XML-ответа. Это не включает вопрос об этой проблеме или решение.

Статьи по Теме

Одна статья предлагает вам просто обслуживать весь сайт как на голом, так и на домене www . Это винты с закладками любого пользователя, вашим поисковым рейтингом и т. Д. И т. П. Вы не должны этого делать.

Некоторые обсуждают размещение статического веб-сайта на S3 и Cloudfront, а не схему перенаправления, и поэтому не связаны между собой.

Итак, как мне сделать это правильно?

Снимок экрана конфигурации Cloudfront - без корневого объекта по умолчанию, указывающего на источник S3. Проигнорируйте InProgress - я только что включил и выключил корневой корневой объект по умолчанию для тестирования.

Распределение Cloudfront без корневого объекта по умолчанию, указывающего на S3

И конфигурация Origin для этого дистрибутива:

Origin - указывает на S3, по умолчанию

Крис Москини
источник
1
Любой запрос к конечной точке веб-сайта, настроенный на перенаправление всего, «должен», делает именно это, включая корневой. Есть ли у вас политика сегмента для этого блока перенаправления? Звучит так, как если бы вы могли, но не должны. Также звучит так, будто вы могли видеть кэшированный ответ Cloudfront GET /до того, как вы исправили свою конфигурацию для использования конечной точки сети.
Майкл - sqlbot
1
На самом деле это был кешированный ответ ListBucket, все еще сохраняющийся в S3, хотя я несколько раз делал недействительными и менял конфигурацию CF. Это займет всего час или 4, чтобы очистить. @ Michael-sqlbot Если вы оставите свой комментарий как ответ, я могу пометить его как принятый.
Крис Москини

Ответы:

4

Если у вас есть эта проблема, проверьте сначала при настройке источника сегмента s3 для облачного фронта, автозаполнение возвращает конечную точку REST s3 domain.amazonaws.com, которая возвращает этот ответ ListBucketResult.

Вы должны записать вручную конечную точку домена domain.s3-website-region.amazonaws.com

Важное замечание : Если у вас неправильно настроен облачный фронт с конечной точкой REST, вы должны аннулировать кэш с помощью Invalidations, или он будет продолжать возвращать ответ REST

lapinkoira
источник
Примечание об аннулировании кэша, наконец, помогло мне решить проблему, которую я преследовал в течение нескольких дней. Спасибо!
Nate
Большое спасибо! Для пользователей терраформировать, в originблоке распределения, использования aws_s3_bucket.BUCKET.website_endpointв domain_name(не bucket_regional_name) и добавить custom_origin_configблок.
Душан
Вы спасатель! Мы боролись с этой проблемой в течение последнего дня, продолжали возвращать ListBucketResult XML обратно, даже если мы меняли настройки распространения. Наконец, после удаления дистрибутива и создания нового, указывающего на domain.s3-website-region.amazonaws.com, редирект сработал для нас!
Дейл Зак
2

Решение: Настройте Redirect, как указано в вопросе, затем дождитесь времени кеширования S3 и CloudFront. Они могут быть 4 часа и более, поэтому вам просто нужно все это настроить, а затем ждать и надеяться на лучшее.

(Это решение Майкла из Комментариев, но прошло уже много лет, и это действительно заслуживает того, чтобы его отметили как Отвечено).

Крис Москини
источник
0

Запись в качестве ответа, поскольку я не могу комментировать - из документации по адресу http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements кажется, что у вас может быть пустой корневой объект по умолчанию:

Если вы не хотите указывать корневой объект по умолчанию при создании дистрибутива, включите пустой элемент DefaultRootObject.

Dani_l
источник
Вы можете (хотя некоторые API-библиотеки запрещают это) - но использование пустого корневого объекта по умолчанию дает мне нелепый XML-ответ ListBucketResult, который вы видите в моем Вопросе.
Крис Москини