Я установил CloudFront поверх нескольких блоков S3 (в разных регионах), чтобы обеспечить быструю стабильную версию моего веб-приложения.Это веб-приложение реализовано с использованием React, что означает, что все это один файл HTML и один файл Javascript.
Используя механизм маршрутизации React, все пути в URL обрабатываются в коде.Это означает, что если я нажму на ссылку типа www.example.com/users
, запрос не будет отправлен на сервер.Вместо этого клиентский код отобразит соответствующую страницу без каких-либо консультаций с сервером (я просто говорю о HTML, а не о данных).Это означает, что если некоторые пользователи вводят указанный URL-адрес, сервер должен вернуть index.html
(единственный HTML-файл, который у меня есть), который затем позаботится об URL-адресе на стороне клиента.Другими словами, все запросы, отправляемые на сервер, должны возвращать либо HTML-файл, либо файл Javascript, который я упоминал ранее.Даже запросы, которые указывают на несуществующие файлы.
Чтобы выполнить это требование, я задал этот вопрос , и я получил ответ, подобный этому:
Мне нужно настроить страницу ошибок для моего дистрибутива в CloudFront и перенаправить все 403 (запрещенные) запросы в файл /index.html
.Это связано с тем, что когда запрос указывает на несуществующий файл на S3, S3 вернет 403 в CloudFront из-за отсутствия разрешения на листинг.Или я могу предоставить разрешение на листинг и вместо этого обработать ошибку 404 (я не проверял этот последний вариант).
В любом случае, я настроил это, и он отлично работает - в течение нескольких часов.Но затем по неизвестной причине запрос к файлу Javascript также возвращает файл HTML.И, конечно же, все, что я получаю, на самом деле происходит из кеша CloudFront, что означает, что независимо от того, сколько раз я отправляю запрос, он будет возвращать одно и то же значение.До тех пор, пока я не аннулирую кэш на CloudFront, который решит проблему еще на несколько часов.И мы обходим все вокруг.
Хотя я не уверен, почему это происходит, но я предполагаю, что в какой-то момент бак S3 недоступен для CloudFront, что приведет к кешированию CloudFront index.html
.Что я могу с этим поделать?