Я пытаюсь сделать что-то относительно простое - я хочу настроить несколько доменов и поддоменов для перенаправления на основной домен нашего сайта, но я хочу разместить перенаправления на Cloudfront. Все работает, кроме перенаправления корневого пути - это дает мне XML-файл, частично описывающий корзину S3.
S3 позволяет настроить ведро с перенаправлением, лайк:
При тестировании конечная веб-точка (brass9-com.s3-website-us-west-1.amazonaws.com) делает то, что должна - перенаправляет на brass9.com. Хорошо.
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 - я только что включил и выключил корневой объект по умолчанию для тестирования.
И конфигурация Origin для этого дистрибутива:
Если у вас есть эта проблема, сначала проверьте, когда вы настраиваете источник ведра s3 для облачного интерфейса, автозаполнение возвращает конечную точку s3 REST domain.amazonaws.com, которые возвращают этот ответ ListBucketResult.
Вы должны записать вручную конечная точка веб-сайта domain.s3-website-region.amazonaws.com
Важный: Если вы неправильно настроили облачный интерфейс с конечной точкой REST, вам необходимо аннулировать кеш с помощью Invalidations, иначе он будет продолжать возвращать ответ REST
Решение. Настройте перенаправление, как указано в вопросе, затем подождите, пока кешируется S3 и CloudFront. Они могут длиться 4 часа или больше, так что вам просто нужно все настроить, а затем ждать и надеяться на лучшее.
(Это решение Майкла из комментариев, но прошли годы, и это действительно заслуживает того, чтобы его пометили как «Отвечено»).
Пишу как ответ, так как я не могу комментировать - из документации на http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements кажется, у вас может быть пустой корневой объект по умолчанию:
Если вы не хотите указывать корневой объект по умолчанию при создании дистрибутива, включите пустой элемент DefaultRootObject.