ページルーティング

目次

ページルーティングの概要


本CMSでは、URLの構造ブログ・カテゴリー・エントリーの設定を元に、表示するテンプレートが自動的に決定されます。
これにより、URL設計とテンプレート設計を連動させることができ、複数ブログや多階層カテゴリーでも柔軟なページ構成が可能です。

ルーティングの流れ

  • URL解析

    • リクエストされたURLから、ブログ・カテゴリー・エントリーなどを特定します。

  • テーマの決定

    • 特定したブログのテーマ設定からテーマを確定します。

  • ページタイプの判定

    • 特定したデータ情報・URLから、トップページ、一覧ページ、エントリー詳細ページなど、ページタイプを決定します。

  • テンプレートの探索

    • ページタイプに応じたテンプレートを、確定したテーマのフォルダ内から優先順に探索します。

  • テンプレートの読み込み

    • 該当テンプレートを読み込み、モジュール・変数を解決してHTMLを生成します。

テーマの確定と、仮想ドキュメントルート


まず、URLからドメインとパス情報を解析して、どのブログを表示するかを決定します。
この仕組みにより、1つのCMS内で複数のブログ(サイト・コンテンツ)を構築でき、それぞれに異なるテーマを適用できます。

ブログ判定の流れ

  • ドメインを確認し、ブログ設定に一致するものを探します。

  • ドメインが同じ場合は、URLパスの先頭部分(ブログコード)を確認して、該当するブログを特定します。

例:3つのブログ構成

ブログ名

ドメイン

コード

備考

ルートブログ

example.com

(なし)

メインサイト

子ブログ1(お知らせ)

example.com

news

ルートブログ配下のパスで運用

子ブログ2(採用サイト)

recruit.example.com

(なし)

サブドメインで独立運用

URLからのブログ決定例

アクセスURL

判定されるブログ

https://example.com

ルートブログ

https://example.com/xxxxx/

ルートブログ

https://example.com/xxxx/xxxx.html

ルートブログ

https://example.com/news/

子ブログ1

https://example.com/news/xxxx/

子ブログ1

https://example.com/news/xxxx/xxxx.html

子ブログ1

https://recruit.example.com/

子ブログ2

https://recruit.example.com/xxxx/

子ブログ2

https://recruit.example.com/news/

子ブログ2

https://recruit.example.com/news/xxxx/

子ブログ2

https://recruit.example.com/news/xxxx.html

子ブログ2

テーマの確定

ブログがURL解析によって確定すると、そのブログに設定されているテーマが決まります。
テーマは、themes ディレクトリ直下のフォルダとして管理され、各フォルダが1つのテーマに対応します。

themes/site
themes/blog
themes/member

仮想ドキュメントルート

決定されたテーマフォルダは、そのブログにおける仮想的なドキュメントルートとして扱われます。
テンプレート内でのファイル指定やリンクは、この仮想ドキュメントルートを起点としたパスで記述します。

例:画像ファイルの参照

例えば themes/site/images/sample.jpg の画像を表示したいときは、以下のように指定します。

<img src="/images/sample.jpg">

実際の動作

テンプレートが解決されると、CMSが実際のディレクトリ構造に合わせてパスを自動書き換えします。上記の例では、ブラウザ上では以下のURLとしてアクセスされます。

https://example.com/themes/site/images/sample.jpg

この仕組みにより、テーマ内のテンプレート構造とブログのURL構造が分離されます。
そのため、後からURL構成を変更してもテンプレート側のパス指定を修正する必要がなく、保守性の高いテンプレートを作成できます。

ページタイプ


テーマフォルダが確定した後は、URL情報をもとにページタイプを判定します。

ページタイプには例えば、以下のような種類があります。

  • トップページ

  • 一覧ページ

  • 詳細ページ

  • 404ページ

  • 管理ページ

ページタイプ例

トップページ

トップページは、各ブログに1ページのみ存在するページタイプです。

トップページの判定例1

ブログの設定でドメインが example.com、ブログコードが空の場合、次のURLでのみトップページと判定されます。

https://example.com

※ クエリパラメータやハッシュ(#以降)は対象外となります。

トップページの判定例2

ブログの設定でドメインが example.com、ブログコードが newsの場合、次のURLでのみトップページと判定されます。

https://example.com/news/

詳細ページ

詳細ページは、CMSのエントリー情報が一意に決まっている時のページタイプです。基本 xxxx.html で終わるURLがこれに該当します。

詳細ページの判定例1

CMSで管理している、エントリーのコード(ファイル名)と同一のURLがこれに該当します。

https://example.com/news/sample.html

※ クエリパラメータやハッシュ(#以降)は対象外となります。

詳細ページの判定例2

例外として、CMSで管理しているエントリーのコード(ファイル名)が空の場合は xxxx.html で終わらないURLになります。

news ブログ or news カテゴリーにエントリーコードが空のエントリーがある場合は、以下URLのページタイプは詳細ページになります。

https://example.com/news/

一覧ページ

一覧ページは、URL上の情報で絞り込みが行われた場合に表示されるページタイプです。
ただし、詳細ページに該当する場合は詳細ページが優先されます

一覧ページの判定例

以下のように、URLでカテゴリ・カスタムフィールド・日時・キーワード・タグなどを指定している場合、一覧ページとして扱われます。複数の条件を組み合わせた絞り込みも対象です。

カテゴリー一覧
https://example.com/news/

カスタムフィールドで検索
https://example.com/field/price/lt/3000

日時で検索
https://example.com/2025/09/

キーワードで検索
https://example.com/keyword/検索ワード/

タグで検索
https://example.com/tag/タグA/タグB/

※ クエリパラメータやハッシュ(#以降)は対象外となります。


404ページ

404ページは、URLの情報からブログ・カテゴリー・エントリーなどが特定できなかった場合かつ、固定テンプレートが存在しない場合(後述)に表示されるページタイプです。

404ページの判定例

存在しないブログ・カテゴリーを指定
https://example.com/hoge/

存在しないエントリーを指定
https://example.com/hoge.html

勘違いしやすいところとして、標準で用意されている絞り込みのURL情報でヒットがない場合には404ページタイプとはなりません

カスタムフィールドで検索でヒットしない
https://example.com/field/price/lt/99999

日時で検索でヒットしない
https://example.com/2099/12/01

キーワードで検索でヒットしない
https://example.com/keyword/hogehogehoge/

タグで検索でヒットしない
https://example.com/tag/タグAAAAAAAAAAAAA/

管理ページ

管理ページは、URLが管理ページのURLだった場合に選択されるページタイプです。基本的にはURLに /admin/xxxxx/ というパスがあると管理ページと認識されます。

管理ページの判定例

https://example.com/bid/1/admin/top/

他にもページタイプによって選択されるテンプレートはありますが、ここでの説明では省略します。

他テンプレートの例

  • サインイン画面 _member/signin.html

  • サインアップ画面 _member/signup.html

  • パスワード再発行画面 _member/reset-password.html

  • プロフィール更新画面 _member/update-profile.html

  • パスワード変更画面 _member/update-password.html

  • 退会画面 _member/withdrawal.html

  • 404エラー画面 404.html

  • 500エラー画面 500.html


ページタイプとテンプレートファイル設定

各ページタイプごとに、使用されるテンプレートファイルを設定できます。設定は 管理ページ > テーマ > テーマ設定 から行います。

テーマ設定画面で、各ページタイプ毎にテンプレートファイルを指定します。
テーマ設定画面

テーマディレクトリの選択

  • テーマディレクトリ名には、現在使用しているテーマ名が表示されます。

  • 本CMS設置ディレクトリ内の themes/ 以下にあるテーマディレクトリが、プルダウンメニューから選択できます。

template.yaml の利用

  • テーマディレクトリ内に template.yaml が存在する場合、「テンプレート設定を有効化」 することで、template.yaml に記述されたテンプレート設定が優先して読み込まれます。

  • template.yaml は、テーマを使いまわす場合に毎回テンプレートファイルを個別設定する手間を省くために利用します。

tpl_top    : index.html
tpl_index  : index.html
tpl_detail : _entry.html
tpl_404    : 404.html
tpl_admin  : admin.html
tpl_login  : _member-admin/login.html

設定の効果

このようにテーマ設定を通じて、各ページタイプごとに表示されるテンプレートファイルを柔軟に切り替えることが可能です。たとえば、以下のようにページタイプごとに異なるテンプレートを割り当てられます。

  • トップページ → _top.html

  • 一覧ページ → index.html

  • 詳細ページ → _entry.html

  • エラーページ → 404.html

  • 管理ページ → admin.html


テーマセット機能は Ver. 3.1 から導入された機能のため、Ver. 3.0 以前のバージョンを利用の方は 管理ページ > コンフィグ > テーマ設定(レガシー設定) からテーマの変更ができます。

テンプレートの探索と決定


これまでの処理で、以下の情報が確定しています。

  • 表示するべき ブログ・カテゴリー・エントリー などの CMS 管理データ

  • 仮想ドキュメントルートとなる テーマ・テーマフォルダ

  • ページタイプとテンプレートファイル の情報

これらをもとに、実際に使用されるテンプレートを探索し、最終的に適用するテンプレートを決定します。ここではテンプレートの探索・決定の流れを順番に見ていきます。


固定テンプレートの決定

最初に確認されるのは、ページタイプに基づく動的な決定よりも優先される 固定テンプレート です。

固定テンプレートとは、URL とテンプレートファイルが 1 対 1 で結びつく仕組みです。
これは、標準的な静的 HTML の表示ルールに従って動作します。

固定テンプレートの例

テーマフォルダ(仮想ドキュメントルート)はすでに決定しているため、
あとは標準的な静的 HTML の表示ルールに従って、対応するテンプレートファイルを探索します。

  • ドメイン: example.com

  • ブログコード: 空(ルートブログ)

  • テーマ設定: site フォルダを使用

URL: https://example.com/about.html
探索テンプレート: themes/site/about.html
URL: https://example.com/company/index.html
探索テンプレート: themes/site/company/index.html
URL: https://example.com/service/plan.html
探索テンプレート: themes/site/service/plan.html

存在すれば、これらのファイルがテンプレートとして決定されます。

固定テンプレートを使う目的

  • 静的に固定したいページをテーマ内に直接設置したい場合

  • CMS のエントリーやカテゴリーに依存せず、単発のページを提供したい場合

  • 専用で他ページとは違うデザイン・スタイルを当てたい場合


固定テンプレートは、CMSのデータとして、カテゴリーやエントリーが存在しなくても表示されますが、テンプレートファイル名と同名のカテゴリーや、エントリーを作成することをお勧めします。

なぜならば、CMSのデータとして存在しない場合、OGP情報などのmeta情報についてもテンプレートで個別に指定する必要があるため、meta情報などは共通テンプレートで、CMSの管理情報から動的に出力することで、実装コストや、設定忘れなどが少なくなるためです。

https://example.com/about.html を固定テンプレートで表示したい場合

  • themes/xxxxx/about.html を作成

  • カテゴリなし

  • about.html というコード名(ファイル名)でエントリーを作成

https://example.com/company/index.html を固定テンプレートで表示したい場合

  • themes/xxxxx/company/index.html を作成

  • company というコード名のカテゴリーを作成


動的テンプレートの決定

固定テンプレートが存在しない場合は、ページタイプに基づいたテンプレート探索へ処理が進みます。

基本動作

動作の流れはシンプルです。

  1. ページタイプを判定する

  2. テーマ設定で、ページタイプに紐づけられたテンプレートファイルを取得する

  3. 仮想ドキュメントルート(テーマフォルダ)内から該当テンプレートを検索し、表示する

基本動作例

  • ブログのドメイン: example.com

  • ブログのコード: 空

  • テーマ設定: site

  • トップページのテンプレート: _top.html

  • 一覧ページのテンプレート: index.html

  • 詳細ページのテンプレート: _entry.html

  • 404ページのテンプレート: 404.html

URLが https://example.com の時使用されるテンプレート

themes/site/_top.html

URLが https://example.com/keyword/アップル/ の時使用されるテンプレート

themes/site/index.html

URLが https://example.com/about.html の時使用されるテンプレート

themes/site/_entry.html

about.html エントリーが存在する前提

一覧ページと詳細ページの特殊な動作

基本的には、上記の基本動作で説明した動きになるのですが、カテゴリーが関わってくると特殊な動作になります。

例えば、以下条件の時の動作を考えてます。

  • ブログのドメイン: example.com

  • ブログのコード: 空

  • テーマ設定: site

  • 一覧ページのテンプレート: index.html

  • 詳細ページのテンプレート: _entry.html

  • news カテゴリーが存在

  • news カテゴリーに entry-1.html が存在

上記条件のとき https://example.com/news/https://example.com/news/entry-1.html のURLでどのテンプレートが利用されるでしょうか。

https://example.com/news/ の場合の探索順序

  1. themes/site/news/index.html を探索

  2. themes/site/index.html を探索

このようにカテゴリーが存在する場合は、そのカテゴリーに動的テンプレートがあるか探索し、存在しない場合は、上階層のテンプレートを探索します。

階層構造になっているカテゴリーも場合も同様で、例えば news/economy カテゴリーがある場合にhttps://example.com/news/economy/ にアクセスした場合は、以下の順番で探索されます。

  1. themes/site/news/economy.html を探索

  2. themes/site/news/index.html を探索

  3. themes/site/index.html を探索

https://example.com/news/entry-1.html の場合の探索順序

詳細ページの探索も一覧ページと同様で、下階層のディレクトリから探索を行なっていきます。

  1. themes/site/news/_entry.html を探索

  2. themes/site/_entry.html を探索


カテゴリー階層を順番にテンプレート探索する方法ですが、動的テンプレートのみ有効になります。固定テンプレートの場合は、上階層を自動で探索しませんので、お気をつけください。


テーマの継承

本CMSでは、使用中のテーマに存在しないテンプレートを別のテーマから継承することが可能です。

このテーマ継承を利用すると、共通ファイルは継承元から利用し、必要な部分だけを個別のテーマに用意するという柔軟な運用ができ、カスタマイズ性とメンテナンス性が大幅に向上します。

テーマ継承の書き方

子ブログのテーマディレクトリ名に @ を利用します。

継承テーマ@継承元テーマ

例: 「site」を元に「blog」テーマを作成する場合

blog@site

この場合、以下のように動作します。

blog/include/header.html が存在しない場合→ site/include/header.html が利用されます。

つまり、子テーマに存在しないファイルは自動的に継承元テーマから補完される仕組みです。

複数階層の継承

継承は 1 段階だけでなく、複数回の指定も可能です。

president@blog@site

この場合、ファイルは以下の順で探索されます。最終的には system テーマを探索します。

  1. president@blog@site テーマ

  2. blog@site テーマ

  3. site テーマ

  4. system テーマ


テンプレートを直接表示させないようにする

本CMSは 静的な HTML と同じ感覚でテーマを作成できる という特徴を持っています。
そのため、特に意識せず実装すると「同じコンテンツが複数の URL で表示されてしまう」という問題が発生することがあります。

重複表示が発生する例

たとえば、サイトトップのテンプレートを top.html とした場合、以下の URL で同じページが表示されます。

  • https://example.com/

  • https://example.com/top.html

このように同一コンテンツが複数の URL で公開されると、SEO や運用上の問題となる場合があります。

解決方法

この問題を解決するため、固定テンプレートとして表示させない仕組みが用意されています。これによりtop.htmlentry.html などの動的テンプレートを直接表示できなくすることができます。

直接表示させないための命名規則

テンプレートの ファイル名やディレクトリ名にアンダーバー(_)を入れることによって、直接アクセスを禁止できます。

直接サクセスさせないためのファイル・ディレクトリ名の例

  • themes/example/_top.html

  • themes/example/_entry.html

  • themes/example/_include/header.html

上記のように、 アンダーバー(_)から始まっているファイル名もしくは、ディレクトリ名があると、そのテンプレートは直接表示されなくなります。

  • https://example.com/_top.html は表示されない

  • https://example.com/_entry.html は表示されない

  • https://example.com/_include/header.html は表示されない


命名規則を変更する

デフォルトは、先頭にアンダーバー(_)がある場合ですが、変更することも可能です。private/config.system.yaml正規表現で設定します。

forbid_direct_access_tpl: /^_/ # off | /^_/  パスのディレクトリまたはファイルがこの正規表現に一致したものは直接表示させない

利用テンプレートの確認方法


サイト制作を進めていくと、テンプレートファイルは増えていきます。
数が多くなると「どのテンプレートが使われているのか分からない」「他の人が作ったテーマを調べるのに時間がかかる」といった課題が出てきます。

ここでは、目的のテンプレートを素早く見つける方法を紹介します。

下準備

まずはテンプレート情報を表示できるように設定を行います。

1. HTML コメントを有効にする

管理画面の 「管理ページ > コンフィグ > 出力設定」 で、
「HTMLコメントの削除」 にチェックが入っている場合は外してください。

これで、インクルードされたファイルの情報が HTML コメントとして出力されるようになります。

出力設定管理画面
出力設定管理画面

2. DEBUG_MODE を有効化する

管理者でCMSにログインし、プロフィール変更ページに移動します。

プロフィール変更ページへ移動
プロフィール変更ページへ移動

プロフィール変更ページで モードデバッグモード に変更します。

デバッグモードに変更
デバッグモードに変更

テンプレート確認方法

1. 使用中のテンプレートを確認する

管理画面にログインした状態で、調べたいページにアクセスすると、
画面右上の 管理ボックス に「現在表示中のテンプレート」が表示されます。

管理ボックスで、テンプレートパスを確認
管理ボックス

これで、まずはどのテンプレートが呼び出されているか確認できます。


2. インクルードファイルを確認する

多くの場合、直接表示されているテンプレートの中でさらに インクルードされたテンプレート が使われています。

ソースコードを確認すると、以下のように HTML コメントでインクルードファイルのパスが出力されます。

<!-- Start of include : source=themes/site/include/parts/message-top.html -->
...
<!-- End of include : source=themes/site/include/parts/message-top.html -->

これにより、どのテンプレートファイルが呼び出されているのかを正確に把握できるようになります。

慣れないうちは、この機能を利用して テンプレートの全体像を把握する のがおすすめです。