После развертывания Nuxt приложения, сайт падает с ошибкой redirected you too many times
Развернул приложение Nuxt(SSR) на хостинге Firebase( + Cloud Run). Cначала все работает и промеж. ПО отрабатывает корректно, но в какой-то момент(при перезагрузке страницы например) сайт падает с ошибкой redirected you too many times, в нетворке вижу постоянный редирект с 'name-site.web.app' на '/login' и обратно. Локально после сборки проекта все работает нормально.
В своем приложении использую vuex (токен храню в куках __session).
nuxt-config.js:
...
router: {
middleware: 'router-auth'
}
...
middleware/router-auth.js:
export default function({ store, redirect, route }) {
const isAuthenticated = !!store.state.auth.user
if (isAuthenticated && route.name == 'login') {
return redirect('/')
}
if (!isAuthenticated && isSecureRoute(route)) {
return redirect('/login')
}
return
}
function isSecureRoute(route) {
if (route.name == 'admin' || route.name == 'settings' || route.name == 'index') {
return true
}
return false
}
component auth form:
...
this.$store.dispatch('auth/login',
{ login: this.login,
password: this.password
}).then(() => {
this.$router.push('/')
})
Не могу понять где ошибка, причем такое поведение заметил только после того как развернул на хостинге и в разный момент может произойти.
UPDATE: Интересный момент. Проблема случается только при перезагрузки домашней страницы(index.vue: '/'), когда ошибка повторилась и происходит редирект, на другие страницы сайта зайти можно без проблем. Причем по внутренним маршрутам(nuxt-link) можно даже на домашнюю страницу зайти, но при ее перезагрузки возможен опять цикл редиректов.
Ответы (2 шт):
На сколько помню, при развертывании хостинга на Firebase спрашивается, будет ли ваше приложение работать как SPA, в таком случае со всех страниц устанавливается редирект в корень сайта к индексному файлу.
Тогда получается, что при переходе по ссылкам внутри сайта, странички подгружаются при помощи роутера и все работает нормально. Когда мы переходим на сайт по прямой ссылке или перезагружаем страницу, то сначала происходит редирект на главную, а там уже опять средствами роутера подгружается нужная страница.
В данном случае, мы редиректим не авторизованного пользователя на страницу '/login', а сам сайт при обращении к данной странице редиректит нас на главную '/', вот и получается зацикливание. Думаю стоит убрать редирект из middleware и реализовать его также средствами роутера, тогда все будет работать корректно.
Поддержка firebase не особо помогла, поэтому решил изменить структуру сайта. Добавил папку pages/secure и разместил там свои страницы, требующие авторизации. Добавил отдельную домашнюю страницу index.vue, соответственно изменил промежуточное ПО. Проблема ушла.
middleware:
export default function({ store, redirect, route }) {
const isAuthenticated = !!store.state.auth.user
if (isAuthenticated && route.path === '/login') {
return redirect('/secure/')
}
if (!isAuthenticated && isSecureRoute(route)) {
return redirect('/login')
}
}
function isSecureRoute(route) {
if (/^\/secure(\/|$)/.test(route.fullPath)) {
return true
}
return false
}