AWS CloudFront неверно интерпретирует правило маршрутизации и перенаправляет ресурс обратно на URL-адрес объекта корзины S3 - PullRequest
0 голосов
/ 21 октября 2019

У меня есть ведро AWS S3;давайте назовем это example.com. У меня настроено ведро для статического хостинга веб-сайтов;URL статического сайта, например, может быть http://example.com.s3-website-us-west-1.amazonaws.com. У меня также есть дистрибутив CloudFront с сертификатом, управляемым AWS, так что, когда я, например, обращаюсь к https://example.com/, он передает контент из корзины S3 http://example.com.s3-website-us-west-1.amazonaws.com/. Это все работает как сон.

На моем сайте у меня есть файл https://example.com/foo.html, который был переименован в https://example.com/bar.html. Некоторые другие страницы в Интернете могут ссылаться на foo.html, поэтому в конфигурации моего сегмента S3 я настроил перенаправление для объекта foo.html, например:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>foo.html</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>bar.html</ReplaceKeyWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>

Когда я пытаюсь перейти к http://example.com.s3-website-us-west-1.amazonaws.com/foo.html, он отправляет HTTP 301 постоянное перенаправление на bar.html, поэтому я получаю значение http://example.com.s3-website-us-west-1.amazonaws.com/bar.html, как я и ожидал.

Итак, теперь я развернул корзину S3 в дистрибутиве CloudFront, как объясненовыше. После того, как состояние CloudFront показывает «Развернуто», я перехожу на https://example.com/foo.html, ожидая, что он будет перенаправлен на https://example.com/bar.html. О нет;Я направлен на http://example.com.s3-website-us-west-1.amazonaws.com/foo.html insetad!

Почему дистрибутив CloudFront перенаправляет меня обратно на буквальный URL-адрес корзины S3? Почему объект не перенаправляется на относительный объект в том же контейнере, правильно развернутый в CloudFront?

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

1 Ответ

0 голосов
/ 21 октября 2019

Прежде всего, CloudFront не следует перенаправлению с источника, получил ответ от S3 и отправил его клиенту в том виде, в каком он есть. S3 отправляет этот ответ, потому что в правилах перенаправления S3 вам также необходимо указать значение HOST.

Например:

<HostName>...</HostName>

Вы можете определить имя хоста как имя example.com ot https://example.com, Имя хоста, которое будет использоваться в заголовке Location, который возвращается в ответе.

https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html

Примечание. Не забудьте очистить кэш, прежде чем вносить изменения, и повторите тестирование,Cloudfront также кэширует ответ 3xx.

...