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
вместо ожидаемого. ПОСТ /v2/пользователи
. Next.js использует коды состояния временного перенаправления 307 и постоянного перенаправления 308, чтобы явно сохранить используемый метод запроса.
-
basePath
:false
или
- если falsebasePath
не будет включен при сопоставлении, может использоваться только для внешних перенаправлений. -
локаль
: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-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("/приборная панель") возвращаться } роутер.