Catch-all маршруты (или маршруты «ловушки») представляют собой универсальные маршруты, которые способны обрабатывать все запросы, не совпадающие с более конкретными маршрутами. Их часто используют в веб-приложениях для обработки динамических URL, страниц с ошибкой 404, или маршрутов с переменным числом сегментов.
В современных JavaScript-фреймворках, таких как Next.js, catch-all маршруты задаются с использованием квадратных скобок и многоточия:
// Пример для Next.js
/pages/posts/[...slug].js
[...slug] указывает, что данный маршрут может
соответствовать любому количеству сегментов после
/posts/.slug всегда приходит в виде массива
строк, где каждый элемент массива соответствует одному сегменту
URL:// Запрос к /posts/2025/12/22/article
slug = ['2025', '12', '22', 'article']
/posts
без дополнительных сегментов), массив может быть пустым.Optional catch-all маршруты позволяют маршруту совпадать как с пустым путем, так и с любым количеством сегментов. В Next.js это обозначается двумя точками перед многоточием:
/pages/docs/[[...params]].js
/docs → params = []/docs/guides/js →
params = ['guides', 'js']Optional catch-all особенно полезны, когда необходимо обработать как базовый путь, так и все вложенные маршруты одним компонентом.
export default function Post({ params }) {
const { slug } = params;
return (
<div>
<h1>Статья: {slug.join('/')}</h1>
</div>
);
}
Такой компонент автоматически отображает любую статью по
динамическому пути, например /posts/tech/javascript.
Catch-all маршрут можно использовать как страницу по умолчанию для всех несуществующих URL:
/pages/[...notFound].js
export default function NotFound() {
return <h1>Страница не найдена</h1>;
}
Любой запрос, не совпавший с существующими маршрутами, попадет на этот компонент.
Для интернет-магазинов или систем документации catch-all маршруты позволяют создавать глубоко вложенные структуры без необходимости вручную описывать каждый маршрут:
/pages/catalog/[...categories].js
/catalog/electronics →
categories = ['electronics']/catalog/electronics/phones →
categories = ['electronics', 'phones']Catch-all маршруты часто используют совместно с API-запросами:
export async function getServerSideProps({ params }) {
const { slug } = params;
const data = await fetch(`https://api.example.com/items/${slug.join('/')}`)
.then(res => res.json());
return { props: { data } };
}
join('/') упрощает
формирование URL для API.Catch-all маршруты в JavaScript создают мощный инструмент для построения динамических и гибких маршрутизируемых приложений, обеспечивая обработку любых URL без необходимости ручного описания каждого пути.