Такое поведение можно выполнить с помощью Lambda @ Edge.Вот план:
Создайте лямбда-функцию, которая будет запускаться при запросе источника (см. Схему, где в жизненном цикле приземляется).Обязательно создайте его в us-east-1
, поскольку это единственный регион, в котором можно определить лямбда-выражения в Lambda @ Edge.
![Cloudfront possible locations for a Lambda@Edge function](https://i.stack.imgur.com/sUBjO.png)
Функция выполняет следующую задачу: переписывать запросы к путям типа /login
, /profile
, /anything_other_than_assets
в /index.html
.Для меня я смог создать правило:
Что-то является активом, если у него есть расширение.В противном случае это путь
Надеюсь, вы можете сделать то же самое или подобное.Вот как выглядело тело моей функции (я использовал узел 8)
const path = require('path')
exports.handler = (evt, ctx, cb) => {
const {request} = evt.Records[0].cf
if (!path.extname(request.uri)) {
request.uri = '/index.html'
}
cb(null, request)
}
Убедитесь, что вы «опубликуете новую версию», а затем скопируйте arn (находится вверху страницы)
![where to copy the ARN of your new lambda function](https://i.stack.imgur.com/dZqAi.png)
вставьте его в раздел «Связи лямбда-функций» вашего поведения S3 Origin.
![Where to paste the ARN of your lambda function](https://i.stack.imgur.com/mhixz.png)
Поскольку ассоциированные функции Lambda @ Edge находятся на уровне источника, такое поведение перенаправления не повлияет на ваше поведение /api/*
.
Обязательно удалите пользовательские обработчики ошибок.Они вам больше не понадобятся для вашего поведения S3, и вы не хотите их для вашего поведения API.