ルーティング
Astroはファイルベースルーティングを使用して、プロジェクトのsrc/pages/
ディレクトリのファイルレイアウトを元にビルドURLを生成します。
ページ間の移動
セクションタイトル: ページ間の移動Astroでは、ルート間の移動に標準的なHTMLの<a>
要素を使用します。フレームワーク固有の<Link>
コンポーネントは提供されていません。
静的ルーティング
セクションタイトル: 静的ルーティングsrc/pages/
ディレクトリにある.astro
ページコンポーネント、MarkdownとMDXファイル(.md
、.mdx
)は、自動的にウェブサイトのページとなります。各ページのルートは、src/pages/
ディレクトリ内における自身のパスとファイル名に対応します。
Astroのプロジェクトでは、別途「ルーティング設定」を管理する必要はありません。src/pages/
ディレクトリにファイルを配置すると、新しいルートが自動的に作成されます。静的ビルドでは、build.format
設定オプションを使用してファイルの出力形式をカスタマイズできます。
動的ルーティング
セクションタイトル: 動的ルーティングAstroページファイルのファイル名に動的ルートパラメータを指定すると、ファイルにマッチするページを複数生成できます。たとえばsrc/pages/authors/[author].astro
は、ブログの各著者に対してプロフィールページを生成します。author
は、ページ内からアクセス可能なパラメーターとなります。
Astroのデフォルトの静的出力モードでは、これらのページはビルド時に生成されるため、author
と対応するファイルを取得する場合、それらのリストを事前に決めておく必要があります。SSRモードでは、ルートにマッチしたリクエストに応じてページが生成されます。
静的(SSG)モード
セクションタイトル: 静的(SSG)モードすべてのルートをビルド時に決める必要があるため、動的ルートはgetStaticPaths()
をエクスポートし、そこでparams
プロパティをもつオブジェクトの配列を返す必要があります。各オブジェクトは対応するルートを生成します。
[dog].astro
はファイル名に動的なdog
パラメーターが定義されているため、getStaticPaths()
から返されるオブジェクトのparams
にはdog
を含める必要があります。Astro.params
を使用してページからこのパラメーターにアクセスできます。
上のコードにより、/dogs/clifford
、/dogs/rover
、/dogs/spot
という3つのページが生成され、各ページでは対応する犬の名前が表示されます。
ファイル名には複数のパラメーターを含められますが、これらをすべてgetStaticPaths()
のparams
オブジェクトに含める必要があります。
上のコードは/en-v1/info
と/fr-v2/info
を生成します。
パラメーターはパス内の異なる部分に設定できます。たとえば、上と同じgetStaticPaths()
をもつsrc/pages/[lang]/[version]/info.astro
ファイルは、/en/v1/info
と/fr/v2/info
のルートを生成します。
getStaticPaths()
についてもっと学ぶ。
レストパラメーター
セクションタイトル: レストパラメーターより柔軟なURLルーティングが必要な場合は、.astro
ファイル名にレストパラメーター([...path]
)を使用することで、任意の深さのファイルパスにマッチさせられます。
上のコードは/sequences/one/two/three
、/sequences/four
、/sequences
を生成します。(レストパラメーターをundefined
に設定することで、トップレベルのページにマッチさせられます。)
レストパラメーターは他の名前付きパラメーターと組み合わせて使用できます。たとえば、GitHubのファイルビューアは以下の動的ルートで表現できます。
この例では、/withastro/astro/tree/main/docs/public/favicon.svg
へのリクエストは、以下の名前付きパラメーターへと分割されます。
複数レベルの動的ページの例
セクションタイトル: 複数レベルの動的ページの例以下の例は、レストパラメーター([...slug]
)とgetStaticPaths()
のprops
機能を使用して、異なる深さのスラグに対してページを生成します。
サーバー(SSR)モード
セクションタイトル: サーバー(SSR)モードSSRモードでも、動的ルートは同じように定義されます。つまり、任意の文字列やパスにマッチさせるために、ファイル名に[param]
や[...path]
などのブラケットを含められます。しかし、各ルートは事前にビルドされないため、マッチしたすべてのルートに対してページが提供されます。これらは「静的」ルートではないため、getStaticPaths
は使用できません。
このページは、resources/users/1
やresources/colors/blue
など、任意のresource
とid
に対して提供されます。
[...slug]
の例をSSR用に変更する
セクションタイトル: [...slug]の例をSSR用に変更するSSRページではgetStaticPaths()
を使用できないため、propsを受け取れません。しかし、オブジェクト内のslug
パラメーターの値を参照することで、前の例をSSRモードにも対応させられます。”/“に対応するルートの場合、スラグパラメーターはundefined
になります。値がオブジェクトに存在しない場合は、404ページにリダイレクトします。
リダイレクト
セクションタイトル: リダイレクト読者を新しいページにリダイレクトしなければならない場合があります。サイトの構造が変更されたために永久的にリダイレクトする必要がある場合や、認証されたルートにログインするといったアクションに応じておこなう場合などです。
Astroの設定で、永久的に移動したページにユーザーをリダイレクトするルールを定義できます。また、ユーザーがサイトを利用した際に動的にリダイレクトすることもできます。
リダイレクトの設定
セクションタイトル: リダイレクトの設定
追加:
astro@2.9.0
redirects
値を使用して、Astroの設定から永久的なリダイレクトのマッピングを指定できます。ほとんどのリダイレクトでは、これは古いルートから新しいルートへのマッピングとなります。
このリダイレクトは、ファイルベースルーティングと同じルールに従います。たとえば、新しいルートと古いルートの両方に同じパラメーターが含まれていれば、動的ルートも可能です。
SSRまたは静的アダプターを使用するとオブジェクトを値として設定でき、そこでstatus
コードや新しいdestination
を指定できます。
astro build
の実行時に、Astroはデフォルトでmeta refreshタグを含むHTMLファイルを出力します。サポートされているアダプターの場合は、代わりにホストの設定ファイルにリダイレクトを含めて出力します。
ステータスコードはデフォルトで301
です。HTMLファイルをビルドする場合、ステータスコードはサーバーによって使用されません。
動的リダイレクト
セクションタイトル: 動的リダイレクトAstro
グローバルのAstro.redirect
メソッドを使用すると、別のページに動的にリダイレクトできます。たとえばクッキーからセッションを取得してユーザーのログイン状態を確認した後などにこれをおこないます。
ルーティングの優先順位
セクションタイトル: ルーティングの優先順位複数のルートが同じURLパスをビルドする可能性があります。たとえば、これらのルートはすべて/posts/create
をビルドできます。
ディレクトリsrc/pages/
- […slug].astro
ディレクトリposts/
- create.astro
- [page].astro
- [pid].ts
- […slug].astro
Astroは、ページをビルドするためにどのルートを使用すべきかを知る必要があります。そのために、以下のルールを順に適用してルートの順番を決定します。
- より多くのパスセグメントを持つルートが、詳細度が低いルートよりも優先される。上の例では、
/posts/
配下のすべてのルートが、/[...slug].astro
よりも優先される。 - パスパラメーターを持たない静的ルートは、動的ルートより優先される。例えば、
/posts/create.astro
は、他のすべてのルートよりも優先される。 - 名前付きパラメーターを使用する動的ルーティングは、レストパラメーターよりも優先される。例えば、
/posts/[page].astro
は/posts/[...slug].astro
よりも優先される。 - 事前レンダリングされた動的ルートは、サーバーの動的ルートよりも優先される。
- エンドポイントはページよりも優先される。
- ルートを上記のルールで解決できない場合、Nodeのデフォルトロケールに基づいてアルファベット順に解決される。
上記のようにファイルが配置されている場合に、リクエストされたURLと、HTMLをビルドするために使用されるルートがどのようにマッチングされるかの例をいくつか見てみましょう。
pages/posts/create.Astro
-/posts/create
だけをビルドしますpages/posts/[pid].ts
-/posts/abc
、/posts/xyz
などをビルドします。しかし、/posts/create
はビルドしませんpages/posts/[page].astro
-/posts/1
、/posts/2
などをビルドします。しかし、/posts/create
、/posts/abc
、/posts/xyz
はビルドしませんpages/posts/[...slug].astro
-/posts/1/2
、/posts/a/b/c
などをビルドします。しかし、/posts/create
、/posts/1
、/posts/abc
などはビルドしませんpages/[...slug].astro
-/abc
、/xyz
、/abc/xyz
などをビルドします。しかし、/posts/create
、/posts/1
、/posts/abc
などはビルドしません
ページネーション
セクションタイトル: ページネーションAstroは、複数のページに分割する必要がある大規模なデータコレクションのために、ページネーションを組み込みでサポートしています。Astroは、前ページと次ページのURL、総ページ数など、一般的なページネーションプロパティを生成します。
ページネーションされるルート名には、標準的な動的ルートと同じ[ブラケット]
構文を使用する必要があります。たとえば、ファイル名 /astronauts/[page].astro
は /astronauts/1
, /astronauts/2
などのルートを生成し、[page]
は生成されるページ番号となります。
paginate()
関数を使用すると、次のように値の配列に対してこれらのページを生成できます。
これで、1ページに2つのアイテムが配置された、以下のページが生成されます。
/astronauts/1
- 1ページ目には「ニール・アームストロング」と「バズ・オルドリン」を表示します/astronauts/2
- 2ページ目には「サリー・ライド」と「ジョン・グレン」を表示します
page
プロパティ
セクションタイトル: page プロパティpaginate()
関数を使用すると、各ページのデータはpage
プロパティで渡されます。page
プロパティは多くの便利なプロパティを持っていますが、ここではそのうち重要なものを紹介します。
- page.data -
paginate()
関数に渡された、ページのスライスデータを含む配列です - page.url.next - セット内の次のページへのリンクです
- page.url.prev - セット内の前のページへのリンクです
完全なAPIリファレンス
セクションタイトル: 完全なAPIリファレンスネストされたページネーション
セクションタイトル: ネストされたページネーションページネーションのより高度なユースケースはネストされたページネーションです。これは、ページネーションを他の動的ルーティングパラメーターと組み合わせたものです。ネストされたページネーションを使用すると、ページネーションされたコレクションを何らかのプロパティやタグでグループ化できます。
たとえば、ページネーションされたMarkdownの投稿を何らかのタグでグループ化したい場合、以下のURLにマッチする/src/pages/[tag]/[page].Astro
ページを作成してネストされたページネーションを使用します。
/red/1
(tag=red)/red/2
(tag=red)/blue/1
(tag=blue)/green/1
(tag=green)
ネストされたページネーションは、paginate()
の結果をグループごとに配列としてgetStaticPaths()
から返すことで動作します。
以下の例では、上記のURLを作成するために、ネストされたページネーションを実装しています。
ページの除外
セクションタイトル: ページの除外アンダースコア(_
)を接頭辞としてファイル名に付けることで、ページやディレクトリをビルドから除外できます。アンダースコアで始まるファイルはルーターによって認識されず、dist/
ディレクトリにも配置されません。
これを使用すると、一時的にページを無効にしたり、テストやユーティリティ、コンポーネントを関連するページと同じフォルダーに配置したりできます。
以下の例では、src/pages/index.astro
とsrc/pages/posts/post1.md
のみがページルートとHTMLファイルとしてビルドされます。
ディレクトリsrc/pages/
ディレクトリ_hidden-directory/
- page1.md
- page2.md
- _hidden-page.astro
- index.astro
ディレクトリposts/
- _SomeComponent.astro
- _utils.js
- post1.md