Catch-all

Catch-all 세그먼트 책임

[...slug]는 여러 URL 조각을 배열로 받는다. 유연하지만 허용할 깊이와 의미를 직접 검증하지 않으면 잘못된 URL이 너무 많이 열릴 수 있다.

01

허용 깊이 결정

docs/a/b/c처럼 깊이가 의미 있는지, 아니면 최대 몇 단계까지만 받을지 규칙을 둔다.

02

배열 검증

slug 배열 길이와 각 값의 형식을 확인해 잘못된 URL을 일찍 notFound로 닫는다.

03

정적 후보 제한

모든 조합을 generateStaticParams로 만들 수 없으면 인기 경로만 미리 만들고 나머지는 다른 전략을 쓴다.

required
최소 1개 segment [...slug]는 배열이 비어 있지 않은 경로에 맞는다.
루트 page는 별도다.
optional
0개 허용 [[...slug]]는 루트와 하위 경로를 한 파일에서 처리할 수 있다.
분기 복잡도가 커진다.
validate
해석 가능성 문서 경로, 카테고리, 필터를 구분해 허용 조합만 통과시킨다.
무한 URL 공간을 닫는다.
canonical
중복 정리 같은 콘텐츠가 여러 catch-all 경로로 열리지 않게 표준 경로를 둔다.
검색 노출과 캐시에 영향이 있다.

깊이 제한 · 중복 URL · 정적 생성 점검

깊이 제한 slug 배열 길이가 예상 범위를 벗어나면 거절하는가.
중복 URL 같은 콘텐츠를 가리키는 여러 경로가 생기지 않는가.
정적 생성 빌드 시 만들 경로 수가 폭발하지 않는가.

배열 검증

const parts = params.slug ?? [];
if (parts.length > 3) notFound();
const doc = await findDocByPath(parts);