Как отключить правило перенаправления корзины S3?

#amazon-web-services #redirect #amazon-s3 #amazon-cloudfront

#amazon-web-services #перенаправление #amazon-s3 #amazon-cloudfront

Вопрос:

У меня есть корзина S3, на которой размещено приложение Vue, использующее маршрутизатор Vue с включенным режимом истории. Изначально у меня было следующее правило перенаправления, чтобы обойти невозможность S3 разрешать «виртуальные» маршруты (на основе этого подхода). Оно добавляет к пути префикс с синтаксисом хэша, который скрипт на странице идентифицирует и удаляет, используя history.pushState() , чтобы превратить его обратно в нехешированный путь, понятный в режиме истории.

 <RoutingRules>
  <RoutingRule>
    <Condition>
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <HostName>mydomain.com</HostName>
      <ReplaceKeyPrefixWith>#!/</ReplaceKeyPrefixWith>
    </Redirect>
  </RoutingRule>
</RoutingRules>
  

Однако более современный подход заключается в том, чтобы просто позволить CloudFront делать это, указывая на 403 и 404 страницы ошибок на /index.html (на основе этого подхода).

После настройки страниц ошибок CloudFront я удалил правило перенаправления из корзины и даже документ с ошибкой из корзины. Однако S3 продолжает использовать правило перенаправления и добавляет к моим маршрутам префикс #!/ .

Как я могу заставить правило перенаправления прекратить работу?

Комментарии:

1. Кэшировал ли CloudFront перенаправления перед их удалением?

2. @Michael-sqlbot Я аннулирую свой кэш CloudFront на index.html каждый раз и все сборки из vue хэшируются. Однако поведение добавления #! к пути все еще сохраняется.

3. Вам нужно сделать недействительным /* , а не index.html .

4. @Michael-sqlbot вот и все. Можете ли вы сформулировать это как ответ, чтобы я мог его принять?

Ответ №1:

Недействительность CloudFront работает с путем, который фактически запрашивает браузер, а не с путем, запрашиваемым с исходного (внутреннего) сервера.

В этом случае, возможно, сработало бы аннулирование / , но /* аннулирует все. Использование /index.html (консоль незаметно добавляет начало, / если вы этого не сделаете) очистит кэш только в том случае, когда браузер запрашивал напрямую /index.html .

CloudFront принимает запросы на аннулирование, даже если они ничему не соответствуют, поскольку запрос на аннулирование по сути является директивой, гарантирующей, что в кэше нет совпадающих объектов. Когда запрос на аннулирование завершается, это условие выполняется — на данный момент нет подходящих объектов. Независимо от того, были ли они удалены или их там никогда не было, можно сказать, что запрос на аннулирование был выполнен успешно, поскольку теперь они исчезли… но побочным эффектом этого является то, что вы не получаете предупреждение, если вы аннулируете что-то, чего там никогда не было.