Почему местоположение перенаправления веб-сайта S3 не сопровождается CloudFront?

18

У меня есть сайт, размещенный на Amazon S3. Это новая версия старого сайта, размещенного на WordPress.

Я настроил некоторые файлы с метаданными Website Redirect Locationдля обработки старого местоположения и перенаправления их на новые страницы веб-сайта.

Например: у меня было http://www.mysite.com/solutionто, что я хочу перенаправить, http://mysite.s3-website-us-east-1.amazonaws.com/product.htmlпоэтому я создал пустой файл с именем solutionвнутри моего ведра с правильными метаданными:

Website Redirect Locationзнак равно /product.html

Метаданные перенаправления S3 эквивалентны тому, 301 Moved Permanentlyчто отлично подходит для SEO. Это прекрасно работает при доступе к URL напрямую из домена S3.

Я также установил дистрибутив CloudFront на основе корзины сайта. И когда я пытаюсь получить доступ через мой дистрибутив, перенаправление не работает, то есть:

http://xxxx123.cloudfront.net/solution не перенаправляет, а загружает пустой файл.

Итак, мой вопрос, как сохранить перенаправление через дистрибутив CloudFront? Или любая идея о том, как справиться с перенаправлением без ухудшения SEO?

Благодарность

Янник Чейз
источник

Ответы:

47

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

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

mysite.s3-website-us-east-1.amazonaws.com

Попадание в дистрибутив Cloudfront только с использованием сегмента в качестве источника не работает, потому что блок фактически не выполняет перенаправления. Он обслуживает только файлы и хранит метаданные.

Надеюсь, это поможет.

bmatsuo
источник
Обратите внимание, что Cloudfront кэширует ответ перенаправления, а не следует за ним. Следовательно, загрузки ресурсов вы перенаправляете в обход Cloudfront.
tfischbach
2
bmatsuo - Если бы мы могли дать вам миллиард очков за это, мы бы. Огромное спасибо. Вы действительно спасли день.
Снайп
Это очень помогло! Стоит упомянуть для любого новичка в S3: чтобы создать статическое ведро, перейдите в ваше ведро и перейдите на вкладку Свойства. Нажмите Статический хостинг. Это даст вам правильный URL, который позволит пересылать :)
rick6
2

Анализ

Согласно документированному поведению запросов и ответов и поддерживаемым кодам состояния HTTP для пользовательских источников , Amazon CloudFront , к сожалению, не выполняет перенаправления :

[...] После настройки перенаправления, когда конечный пользователь в первый раз отправляет запрос на объект, CloudFront Front отправляет запрос источнику, а источник отвечает перенаправлением (например, 302 Временно перемещено). CloudFront кэширует перенаправление и возвращает его конечному пользователю. CloudFront не следует перенаправлению. [Акцент мой]

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

Соответственно, я рискну предположить, что вы не получаете пустой файл с HTTP-кодом состояния 200 OK , а скорее HTTP-статусом 301 Постоянно перемещено без тела вообще - вы действительно проверяли это с помощью браузера или в конечном итоге только с помощью инструмента командной строки, такого как например cURL или HTTPie ? Последние инструменты обычно требуют явного параметра, чтобы следовать перенаправлениям, так что это может легко остаться незамеченным.

Потенциальное решение

Если анализ окажется верным, вам нужно настроить перенаправление, чтобы вместо этого явно указать целевой CloudFront, снова см. Перенаправления :

Вы можете настроить свой веб-сервер для перенаправления запросов в одно из следующих мест:

  • Новый URL-адрес объекта на исходном сервере. Когда конечный пользователь выполняет перенаправление на новый URL-адрес, конечный пользователь обходит CloudFront и сразу переходит к источнику. В результате мы рекомендуем не перенаправлять запросы на новый URL-адрес объекта в источнике.

  • Новый CloudFront URL для объекта. Когда конечный пользователь отправляет запрос, содержащий новый URL-адрес CloudFront, CloudFront получает объект из нового местоположения в вашем источнике, кэширует его в крайнем местоположении и возвращает объект конечному пользователю. Последующие запросы на объект будут обслуживаться пограничным местоположением. Это позволяет избежать задержки и нагрузки, связанной со зрителями, запрашивающими объект от источника. Однако за каждый новый запрос объекта будет взиматься плата за два запроса к CloudFront.

Штеффен Опель
источник
Когда я отбираю URL, который должен быть перенаправлен через дистрибутив CloudFront, я получаю: Насколько я HTTP/1.0 200 OK Content-Type: application/octet-stream Content-Length: 0 понимаю, перенаправление управляется S3, и в этом случае файл размещается в CloudFront, и ему не нужны заголовки перенаправления, установленные для S3 As S3 это веб-сервер файла, я не могу сопоставить перенаправление, кроме как с метаданными.
Янник Чейз