У меня есть дистрибутив CloudFront, который указывает на корзину S3, содержащую статический контент моего сайта.Это делается с использованием конечных точек API SEST REST, поэтому доменное имя и путь источника выглядят так:
bucket-name.s3.amazonaws.com
Пока это работает, и я знаю это, потому что когда я открываю браузер и ввожу https://xxxxxxxxxxxxx.cloudfront.net/index.html
, он загружает HTML-файл.Но это еще не все, что мне нужно.Мой сайт представляет собой SPA (одностраничное приложение), написанное на React.Это означает, что не все ресурсы, упомянутые в коде на стороне клиента, могут быть найдены в корзине.Те ресурсы, которые физически недоступны в корзине, являются виртуальными ресурсами и должны обрабатываться кодом на стороне клиента.
Чтобы это работало, если пользователь вводит адрес виртуального URL-адреса в браузерсначала сервер должен проверить, существует ли этот ресурс или нет.Если это не так, сервер должен вернуть файл index.html
вместо ошибки 404.Это можно настроить на страницах ошибок CloudFront.
Таким образом, я создал ответ об ошибках на основе для моего дистрибутива CloudFront, который обрабатывает все 404 ошибки, возвращая файл index.html
со статусом 200 ok.Но это не работает.
При вводе URL https://xxxxxxxxxxxxx.cloudfront.net/virtual-url
возвращается:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>39E3967AA5F16693</RequestId>
<HostId>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</HostId>
</Error>
Даже голый URL https://xxxxxxxxxxxxx.cloudfront.net
возвращает точно такую же ошибку.
Итак, мой вопрос: как я могу использовать страницы ошибок CloudFront, когда в дистрибутиве используется конечная точка API SEST REST?
PS Когда я использовал статическую конечную точку веб-сайта S3 (bucket-name.s3-website.us-east-1.amazonaws.com
), тот же механизмработал.