カテゴリ: Next.js 更新日: 2026/04/09

Next.jsで[[...slug]]を使ったオプショナルキャッチオールルートの完全ガイド!初心者でもわかるNext.jsルーティング

Next.jsで [[...slug]] を使うオプショナルキャッチオール
Next.jsで [[...slug]] を使うオプショナルキャッチオール

先生と生徒の会話形式で理解しよう

生徒

「先生、Next.jsでページを複数のURLパターンでまとめて扱いたいときってどうすればいいですか?」

先生

「その場合は、Next.jsのキャッチオールルートを使うと便利です。特に[[...slug]]という書き方を使うとオプショナルキャッチオールルートになります。」

生徒

「キャッチオールルートって何ですか?オプショナルってどういう意味ですか?」

先生

「キャッチオールルートは、指定したフォルダ以下のすべてのURLをまとめて受け取る仕組みです。オプショナルというのは、URLが空でも問題なく動作するという意味です。」

生徒

「具体的にはどんなコードになるんですか?」

先生

「それでは、順番に具体例を見ていきましょう。」

1. Next.jsのキャッチオールルートとは?

1. Next.jsのキャッチオールルートとは?
1. Next.jsのキャッチオールルートとは?

Next.jsでは、通常のページはファイル名とURLが1対1で対応します。しかし、複数のパスを1つのページでまとめて処理したい場合があります。例えば、ブログの投稿ページが複数ある場合、個別にファイルを作るのは大変です。そこでキャッチオールルートを使うと、すべてのURLを1つのファイルで受け取れます。

通常のキャッチオールは[...slug].jsで書きますが、オプショナルキャッチオールは[[...slug]].jsです。オプショナルの場合、URLが空のときもページを表示できます。

2. [[...slug]]の基本的な使い方

2. [[...slug]]の基本的な使い方
2. [[...slug]]の基本的な使い方

まずは簡単な例を見てみましょう。


import { useRouter } from "next/router";

export default function Page() {
  const router = useRouter();
  const { slug } = router.query;

  return (
    <div>
      <h1>オプショナルキャッチオールページ</h1>
      <p>slugの値: {slug ? slug.join("/") : "なし"}</p>
    </div>
  );
}
(URLが /posts/2026/02/15 の場合、slugの値は ["posts","2026","02","15"] となり、画面に posts/2026/02/15 と表示されます。URLが / の場合は「なし」と表示されます)

3. URLが空でも動作するオプショナルキャッチオール

3. URLが空でも動作するオプショナルキャッチオール
3. URLが空でも動作するオプショナルキャッチオール

普通のキャッチオール([…slug])はURLが必ず存在する必要がありますが、オプショナル([[...slug]])はURLが空でもページを表示できます。例えばトップページでも同じコンポーネントを使うことができます。


import { useRouter } from "next/router";

export default function OptionalPage() {
  const router = useRouter();
  const { slug } = router.query;

  return (
    <div>
      <h1>トップまたは任意のパスに対応</h1>
      <p>{slug ? `URLパス: ${slug.join("/")}` : "トップページです"}</p>
    </div>
  );
}
(URLが /about/team の場合は「URLパス: about/team」と表示され、/ の場合は「トップページです」と表示されます)

4. 実際のブログページで使う例

4. 実際のブログページで使う例
4. 実際のブログページで使う例

例えばブログの投稿ページをまとめて1つのコンポーネントで管理したい場合、次のように書けます。


import { useRouter } from "next/router";

export default function BlogPage() {
  const router = useRouter();
  const { slug } = router.query;

  if (!slug) {
    return <h1>ブログトップページ</h1>;
  }

  return (
    <div>
      <h1>ブログ記事: {slug.join("/")}</h1>
      <p>ここに記事の内容を表示できます。</p>
    </div>
  );
}
(/blog/2026/02/15 にアクセスすると「ブログ記事: blog/2026/02/15」と表示されます。/blog にアクセスすると「ブログトップページ」と表示されます)

5. ネストされたパスにも対応可能

5. ネストされたパスにも対応可能
5. ネストされたパスにも対応可能

キャッチオールルートは階層が深いURLでも対応できます。URLが /products/electronics/phone のように複数階層でも、slug配列としてまとめて取得できます。


import { useRouter } from "next/router";

export default function ProductPage() {
  const router = useRouter();
  const { slug } = router.query;

  return (
    <div>
      <h1>商品ページ</h1>
      <p>{slug ? `カテゴリー: ${slug.join(" > ")}` : "全商品一覧"}</p>
    </div>
  );
}
(URLが /products/electronics/phone の場合、「カテゴリー: products > electronics > phone」と表示されます。/products の場合は「全商品一覧」と表示されます)

6. getStaticPathsと組み合わせる方法

6. getStaticPathsと組み合わせる方法
6. getStaticPathsと組み合わせる方法

静的生成(Static Generation)を使う場合、オプショナルキャッチオールルートはgetStaticPathsと組み合わせることができます。


export async function getStaticPaths() {
  return {
    paths: [
      { params: { slug: ["blog","2026","02","15"] } },
      { params: { slug: ["blog","2026","02","16"] } }
    ],
    fallback: true
  };
}

export async function getStaticProps({ params }) {
  return { props: { slug: params.slug || null } };
}
(指定した記事だけを事前生成できます。URLが空の場合も props.slug は null になります)

7. まとめて使うと便利なポイント

7. まとめて使うと便利なポイント
7. まとめて使うと便利なポイント

オプショナルキャッチオールルート([[...slug]])は、複雑なURL構造を1つのページで管理できるため、ブログやECサイトなどで非常に便利です。URLが空の場合も対応できるので、トップページやカテゴリー一覧なども同じコンポーネントで扱えます。さらにgetStaticPathsgetStaticPropsと組み合わせると、静的生成と動的ルーティングの両方に対応可能です。

まとめ

まとめ
まとめ

本記事ではNext.jsにおけるオプショナルキャッチオールルート([[...slug]])の使い方について、初心者でも理解しやすい形で解説しました。Next.jsでは通常のページはURLとファイルが一対一で対応していますが、ブログ記事や商品ページ、複雑な階層構造のサイトでは同じコンポーネントで複数のURLをまとめて処理したい場面があります。そこでオプショナルキャッチオールルート([[...slug]])を使うことで、URLが存在しない場合でも安全にページを表示でき、トップページやカテゴリー一覧なども統一したコードで管理することが可能です。

基本的な使い方として、useRouterフックを使いrouter.query.slugで配列としてURLパスを取得する方法を紹介しました。URLが存在する場合は配列に格納され、存在しない場合はundefinedとなるため、条件分岐で「なし」や「トップページです」といった表示を簡単に制御できます。これによりユーザーがどのURLにアクセスしても、同じコンポーネント内で柔軟に対応できるのが大きな利点です。

またネストされたURL構造にも対応可能で、URLが複数階層の場合でもslug.join("/")slug.join(" > ")を用いることで、画面上に見やすい形式で表示できます。例えばECサイトのカテゴリーページやブログ記事の詳細ページなど、URLの階層構造が複雑な場合でも1つのコンポーネントで全て管理できるため、保守性や再利用性が格段に向上します。

静的生成(Static Generation)を利用する場合には、getStaticPathsと組み合わせることで、事前に特定の記事やページのみを生成することも可能です。fallback: trueを設定することで、未指定のパスにアクセスした場合でも動的に生成されるため、ユーザー体験を損なわずにページを提供できます。さらにgetStaticPropsparams.slugを取得すれば、サーバーサイドで必要なデータを柔軟に渡すこともできます。

実際のプロジェクトでの利便性として、ブログサイト、ECサイト、ポートフォリオサイトなど、多階層で動的なルーティングが必要なケースに非常に適しています。コードの簡素化だけでなく、URL構造の変更やページ追加にも容易に対応でき、開発効率の向上にもつながります。これにより、Next.jsでの柔軟なルーティング設計が実現できます。

さらに、Reactコンポーネントの書き方も統一することで、開発者が読みやすく保守しやすいコードベースを構築できます。オプショナルキャッチオールルートを活用することで、トップページ、カテゴリーページ、詳細ページなど異なるページタイプを一つのコンポーネントで管理し、条件分岐で内容を切り替えることができます。これによりコードの重複を減らし、バグの発生率も抑えられます。

サンプルとしては以下のように簡単にオプショナルキャッチオールを利用したコンポーネントを作成できます。


import { useRouter } from "next/router";

export default function OptionalCatchAll() {
  const router = useRouter();
  const { slug } = router.query;

  return (
    <div>
      <h1>オプショナルキャッチオールデモ</h1>
      <p>{slug ? `アクセスされたパス: ${slug.join("/")}` : "トップページです"}</p>
    </div>
  );
}
(画面に「トップページです」と表示され、/blog/2026/02/15 にアクセスすると「アクセスされたパス: blog/2026/02/15」と表示されます)
先生と生徒の振り返り会話

生徒

「先生、[[...slug]]って覚えやすくて便利ですね。URLが空でも大丈夫だし、階層が深くても対応できるのがすごいです」

先生

「その通りです。特にブログやECサイトのように多階層で動的なページを扱う場合、このオプショナルキャッチオールルートは非常に有効です。さらに静的生成と組み合わせることでパフォーマンスも確保できます」

生徒

「getStaticPathsとgetStaticPropsを一緒に使えば、事前に生成したいページだけ静的にして、それ以外は動的に表示できるんですね」

先生

「その通りです。これによりユーザーはどのURLにアクセスしても適切なコンテンツが表示され、開発者もコードの管理が楽になります。まとめると、[[...slug]]は柔軟性と保守性を両立できるNext.jsの強力な機能です」

生徒

「なるほど。条件分岐でトップページやカテゴリー一覧、詳細ページも一つのコンポーネントで管理できるから、コードがすっきりしますね」

先生

「そうです。これを理解すれば、Next.jsでの複雑なルーティング設計も効率的に行えるようになります。実務でも必ず役立つ知識です」

カテゴリの一覧へ
新着記事
New1
Next.js
Next.jsで[[...slug]]を使ったオプショナルキャッチオールルートの完全ガイド!初心者でもわかるNext.jsルーティング
New2
Next.js
Next.jsのCatch-all Routes完全解説!初心者でもわかる[...slug]キャッチオールルーティング入門
New3
React
Reactでkey属性にインデックスを使う際の注意点を初心者向けに解説
New4
React
ReactのuseEffectでタイマー処理を実装する方法を徹底解説!初心者でもできるReactフック入門
人気記事
No.1
Java&Spring記事人気No1
React
Reactとは?初心者でもわかるReact.jsの基本概念と特徴をやさしく解説
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
React
Reactの学習ロードマップ!初心者が最短で習得する流れを完全ガイド
No.5
Java&Spring記事人気No5
Next.js
Next.js自動ルーティングを初心者向けに解説!Next.jsのページ遷移の基本を理解する
No.6
Java&Spring記事人気No6
React
React Context APIの分割方法を解説!パフォーマンスを高めるベストプラクティス
No.7
Java&Spring記事人気No7
Next.js
Next.js CSRとISRの使い分けを初心者向けに解説!具体例でわかるNext.jsのレンダリング方法
No.8
Java&Spring記事人気No8
React
React Context APIでフォーム管理を効率化!初心者向け実践ガイド