next.config.js: Перенаправления | Next.js
Примеры- Перенаправления
| Версия | Изменения |
|---|---|
v10.2.0 1 добавил. | |
v9.5.0 | Добавлены редиректы. |
Перенаправления позволяют перенаправить путь входящего запроса на другой путь назначения.
Чтобы использовать перенаправления, вы можете использовать ключ перенаправления в next.config.js :
module.exports = {
асинхронные перенаправления () {
возвращаться [
{
источник: '/о',
место назначения: '/',
постоянный: правда,
},
]
},
}
перенаправляет — это асинхронная функция, которая ожидает возврата массива, содержащего объекты с источником , назначением и постоянными свойствами:
-
источник— шаблон пути входящего запроса.
-
пункт назначения— это путь, по которому вы хотите выполнить маршрут. -
постоянныйистинныйилиложный- еслиистинныйбудет использовать код состояния 308, который указывает клиентам/поисковым системам навсегда кэшировать перенаправление, еслиложноебудет использовать код состояния 307, который является временным и не является кэшировано.
Почему Next.js использует 307 и 308? Традиционно код 302 использовался для временного перенаправления, а код 301 — для постоянного перенаправления, но многие браузеры изменили метод запроса перенаправления на
независимо от исходного метода. Например, если браузер сделал запросGET POST /v1/users, который вернул код состояния302с местоположением/v2/users, последующий запрос может бытьGET /v2/usersвместо ожидаемого.. Next.js использует коды состояния временного перенаправления 307 и постоянного перенаправления 308, чтобы явно сохранить используемый метод запроса.ПОСТ /v2/пользователи
-
basePath:falseили- если false undefinedbasePathне будет включен при сопоставлении, может использоваться только для внешних перенаправлений. -
локаль:falseилиundefined- не следует ли включать локаль при сопоставлении. -
has— это массив объектов has со свойствамиtype,keyиvalue. -
отсутствующийпредставляет собой массив отсутствующих объектов со свойствамитипа,ключаизначения.
Перенаправления проверяются перед файловой системой, которая включает страницы и файлы .
Перенаправления не применяются к маршрутизации на стороне клиента ( Link , router. ), если промежуточное ПО не присутствует и не соответствует пути.
push
При применении перенаправления любые значения запроса, предоставленные в запросе, будут переданы в пункт назначения перенаправления. Например, см. следующую конфигурацию перенаправления:
{
источник: '/старый-блог/:путь*',
пункт назначения: '/блог/:путь*',
постоянный: ложный
}
При запросе /old-blog/post-1?hello=world клиент будет перенаправлен на .
Совпадения путей разрешены, например, /old-blog/:slug будет соответствовать /old-blog/hello-world (без вложенных путей):
module.exports = {
асинхронные перенаправления () {
возвращаться [
{
источник: '/old-blog/:slug',
назначение: '/news/:slug', // Соответствующие параметры могут использоваться в назначении
постоянный: правда,
},
]
},
}
Сопоставление пути с подстановочным знаком
Для сопоставления пути с подстановочным знаком вы можете использовать * после параметра, например, /blog/:slug* будет соответствовать /blog/a/b/c/d/hello-world :
модуль.экспорт = { асинхронные перенаправления () { возвращаться [ { источник: '/блог/:слаг*', назначение: '/news/:slug*', // Соответствующие параметры могут использоваться в назначении постоянный: правда, }, ] }, }
Соответствие пути регулярного выражения
Чтобы найти соответствие пути регулярного выражения, вы можете заключить регулярное выражение в круглые скобки после параметра, например /post/:slug(\\d{1,}) будет соответствовать /post/123 , но не /post/abc :
module.exports = {
асинхронные перенаправления () {
возвращаться [
{
источник: '/post/:slug(\\d{1,})',
назначение: '/news/:slug', // Соответствующие параметры могут использоваться в назначении
постоянный: ложный,
},
]
},
}
Следующие символы ( , ) , { , } , : , * , + , ? используются для сопоставления путей регулярных выражений, поэтому при использовании в источнике в качестве неспециальных значений их необходимо экранировать, добавив перед ними \\ :
module.exports = { асинхронные перенаправления () { возвращаться [ { // это будет соответствовать запрашиваемому `/english(default)/something` источник: '/english\\(по умолчанию\\)/:slug', пункт назначения: '/en-us/:slug', постоянный: ложный, }, ] }, }
Для соответствия перенаправлению только в том случае, если значения заголовка, файла cookie или запроса также соответствуют имеет поле или не соответствует , можно использовать отсутствующее поле . И исходный , и все имеют элементы , которые должны совпадать, и все отсутствующие элементы не должны совпадать для применения перенаправления.
имеет и отсутствующие Предметы могут иметь следующие поля:
-
Тип:Строка— Должен быть либозаголовок,Cookie,HEST, OR2222222222222222222222222222222222222.
-
ключ:Строка- ключ выбранного типа для сопоставления. -
значение:Строкаилиundefined- значение для проверки, если не определено, любое значение будет соответствовать. Строка, подобная регулярному выражению, может использоваться для захвата определенной части значения, например. если значениеиспользуется для first-(?.*) first-second, тоsecondможно будет использовать в пункте назначения с:paramName.
модуль.экспорт = {
асинхронные перенаправления () {
возвращаться [
// если присутствует заголовок `x-redirect-me`,
// это перенаправление будет применено
{
источник: '/:путь((?!другая-страница$).*)',
имеет: [
{
тип: 'заголовок',
ключ: 'x-перенаправить меня',
},
],
постоянный: ложный,
пункт назначения: '/другая-страница',
},
// если присутствует заголовок `x-dont-redirect`,
// это перенаправление НЕ будет применено
{
источник: '/:путь((?!другая-страница$).
*)',
отсутствующий: [
{
тип: 'заголовок',
ключ: 'x-не-перенаправлять',
},
],
постоянный: ложный,
пункт назначения: '/другая-страница',
},
// если источник, запрос и файл cookie совпадают,
// это перенаправление будет применено
{
источник: '/специфический/:путь*',
имеет: [
{
тип: 'запрос',
ключ: "страница",
// значение страницы не будет доступно в
// место назначения, так как значение предоставлено и не
// использовать именованную группу захвата, например. (? домой)
значение: «дом»,
},
{
тип: 'куки',
ключ: «авторизованный»,
значение: «истина»,
},
],
постоянный: ложный,
пункт назначения: '/другой/:путь*',
},
// если заголовок `x-authorized` присутствует и
// содержит совпадающее значение, будет применено это перенаправление
{
источник: '/',
имеет: [
{
тип: 'заголовок',
ключ: «x-авторизованный»,
значение: '(?<авторизованный> да|истина)',
},
],
постоянный: ложный,
пункт назначения: '/home?authorized=:authorized',
},
// если хост `example.
com`,
// это перенаправление будет применено
{
источник: '/:путь((?!другая-страница$).*)',
имеет: [
{
тип: «хост»,
значение: 'example.com',
},
],
постоянный: ложный,
пункт назначения: '/другая-страница',
},
]
},
}
Перенаправления с поддержкой basePath
При использовании поддержки basePath с перенаправлениями каждый источник и пункт назначения автоматически имеют префикс basePath , если только вы не добавите basePath module = 4exports 90s 90:19 redirect {
базовый путь: '/ документы',
асинхронные перенаправления () {
возвращаться [
{
источник: '/with-basePath', // автоматически становится /docs/with-basePath
назначение: '/another', // автоматически становится /docs/another
постоянный: ложный,
},
{
// не добавляет /docs, так как basePath: false установлен
источник: '/без-basePath',
пункт назначения: «https://example.
com»,
базовый путь: ложь,
постоянный: ложный,
},
]
},
}
Перенаправления с поддержкой i18n
При использовании поддержки i18n с перенаправлениями каждый источник и пункт назначения автоматически получают префикс для обработки настроенных локалей , если вы не добавите локаль для перенаправления : false Если используется локаль : false , вы должны добавить префикс источника и назначения с локалью, чтобы они сопоставлялись правильно.
модуль.экспорт = {
i18n: {
локали: ['en', 'fr', 'de'],
язык по умолчанию: 'en',
},
асинхронные перенаправления () {
возвращаться [
{
source: '/with-locale', // автоматически обрабатывает все локали
назначение: '/another', // автоматически передает локаль на
постоянный: ложный,
},
{
// не обрабатывает локали автоматически, поскольку установлено значение locale: false
источник: '/nl/with-locale-manual',
пункт назначения: '/nl/другой',
локаль: ложь,
постоянный: ложный,
},
{
// это соответствует '/', так как `en` является языком по умолчанию
источник: '/ru',
пункт назначения: '/en/other',
локаль: ложь,
постоянный: ложный,
},
// можно сопоставить все локали, даже если установлена локаль: false
{
источник: '/:локаль/страница',
пункт назначения: '/en/newpage',
постоянный: ложный,
локаль: ложь,
}
{
// это преобразуется в /(en|fr|de)/(.
*), поэтому не будет соответствовать верхнему уровню
// Маршруты `/` или `/fr`, такие как /:path*,
источник: '/(.*)',
пункт назначения: '/другой',
постоянный: ложный,
},
]
},
}
В некоторых редких случаях вам может потребоваться назначить пользовательский код состояния для более старых HTTP-клиентов для правильного перенаправления. В этих случаях можно использовать свойство statusCode вместо постоянного свойства , но не оба сразу. Примечание. Для обеспечения совместимости с IE11 заголовок Refresh автоматически добавляется к коду состояния 308.
- Внутри маршрутов API вы можете использовать
res.redirect(). - Внутри
getStaticPropsиgetServerSideProps, вы можете перенаправить определенные страницы во время запроса.
Как реализовать перенаправления на стороне клиента в Next.js
В vanilla React вы можете выполнять перенаправления, визуализируя компонент Redirect из библиотеки react-router-dom .
импорт {Перенаправление} из "react-router-dom"
...
<Точный путь маршрута="/">
{вошел в систему? : }
Но как реализовать переадресацию на стороне клиента с помощью встроенной системы маршрутизации Next.js?
В этой статье я расскажу о шагах по реализации перенаправления на стороне клиента в Next.js, используя в качестве примера, должен ли пользователь перейти на панель инструментов (если он вошел в систему) или на домашнюю страницу (если не вошел в систему).
1. Доступ к объекту маршрутизатора с помощью
useRouter() В Next.js любая логика маршрутизации управляется объектом router , доступ к которому можно получить с помощью хука useRouter().
импорт {useRouter} из «следующего/маршрутизатора»
приложение функции () {
постоянный маршрутизатор = useRouter()
...
}
экспортировать приложение по умолчанию Объект маршрутизатора предоставляет ряд свойств и функций, которые вы можете использовать для любых действий, связанных с маршрутизацией, таких как изменение страницы ( router.) или получение текущего пути (
push() router.pathname ).
2. Поместите логику перенаправления внутри
useEffect() В то время как vanilla React перенаправляет путем рендеринга компонента ( ), Next.js может изменить страницу, только вызвав функцию, такую как router. нажать() .
Лучшее место для вызова этой функции — useEffect() .
импорт {useEffect} из "реагировать"
импортировать {useRouter} из "следующего/маршрутизатора"
приложение функции ({ авторизовался }) {
постоянный маршрутизатор = useRouter()
использоватьЭффект(() => {
если (вошел в систему) {
router.push("/приборная панель")
возвращаться
}
роутер.push("/)
}, [])
вернуть "Загрузка..."
}
экспортировать приложение по умолчанию 3. Управление стеком истории с помощью
router.replace() Изображение у вас есть функция, состоящая из нескольких страниц со следующей структурой URL:
-
/feature(pages/feature/index.для перенаправления логики на другие страницы)
tsx -
/feature/start(страниц/feature/start.tsx) -
/feature/continue(страниц/feature/continue.tsx) -
/feature/success(страниц/feature/end.tsx)
Что делать, если вы не хотите сохранять страницу перенаправления /feature в стеке истории?
Вы можете использовать router.replace().
Это изменит страницу, не сохраняя ее в стеке истории, избегая повторного выполнения логики перенаправления, если пользователь щелкнет стрелку назад в своем браузере.
импорт {useEffect} из "реагировать"
импортировать {useRouter} из "следующего/маршрутизатора"
приложение функции ({ авторизовался }) {
постоянный маршрутизатор = useRouter()
использоватьЭффект(() => {
если (вошел в систему) {
router.replace("/приборная панель")
возвращаться
}
роутер.


ПОСТ /v2/пользователи 



com`,
// это перенаправление будет применено
{
источник: '/:путь((?!другая-страница$).*)',
имеет: [
{
тип: «хост»,
значение: 'example.com',
},
],
постоянный: ложный,
пункт назначения: '/другая-страница',
},
]
},
}
*), поэтому не будет соответствовать верхнему уровню
// Маршруты `/` или `/fr`, такие как /:path*,
источник: '/(.*)',
пункт назначения: '/другой',
постоянный: ложный,
},
]
},
}
tsx 