Craft CMS でサブドメインから特定のテンプレートにアクセスさせるには

Craft CMS では、フロントエンドからユーザー登録する仕組みを比較的簡単に用意することができます。 具体的な設定方法については、ひとまず過去記事や公式ドキュメントを参考にしていただくとして。

Front-End User Accounts | Craft CMS
https://craftcms.com/knowledge-base/front-end-user-accounts

「ログイン後のマイページ機能だけ、サイトの ベース URL として登録されていないサブドメインでアクセスさせたい」という場合は、ルーティングの調整が必要になります。

そこで、今回は Craf CMS でサブドメインからのアクセスをテンプレートと紐づける方法について、まとめてみます。
これは Craft CMS Advent Calendar 2024 7日目の記事です。

ルーティングを調整するには?

Craft CMS でルーティングを設定するには、次の2つの方法があります。

  • 管理画面の 設定 > ルート から GUI で操作する
  • インストールディレクトリ直下の config/routes.php で直接コードを編集する

管理画面で操作する場合、あらかじめ用意されている URL トークン(year なら 4つの連続した数字 を意味する、など)を利用して効率的に調整できます。

月別アーカイブのルーティング設定サンプル

「チャンネル」のエントリを年別や月別のアーカイブにする際に必要となるため、公式ドキュメントにも目を通しておくとよいでしょう。

Routing | Craft CMS Documentation | 5.x
https://craftcms.com/docs/5.x/system/routing.html

ただし、この方法では今回の目的である「サイトの ベース URL として登録されていないサブドメインからのアクセス」には対応できません。

config/routes.php で調整する

ということで、次の3つのステップで調整を行います。

  • .env にベース URL をセット
  • config/general.php にエイリアスをセット
  • config/routes.php にルーティングの指定を追加

.env にベース URL をセット

サイトが craftcms.test、マイページが mypage.craftcms.test とし、MYPAGE_SITE_URL に URL をセットします。

MYPAGE_SITE_URL=https://mypage.craftcms.test

config/general.php にエイリアスをセット

エイリアス @mypageUrl.env で定義した定数を紐づけます。

<?php

use craft\helpers\App;

return [
    (中略)

    'aliases' => [
        '@mypageUrl' => App::env('MYPAGE_SITE_URL'),
    ],
];

config/routes.php にルーティングの指定を追加

エイリアス @mypageUrl を変数にセットし、ルーティング定義の左辺にドメイン込みのパスをセットします。

<?php
// マイページのベース URL をセット
$mypageUrl = Craft::getAlias('@mypageUrl');

return [
    $mypageUrl . '/dashboard' => ['template' => '_mypage/dashboard'],
    $mypageUrl . '/edit-profile' => ['template' => '_mypage/edit-profile/index'],
    $mypageUrl . '/edit-profile/finish' => ['template' => '_mypage/edit-profile/finish'],
];

これで https://mypage.craftcms.test/dashboardtemplates/_mypage/dashboard.twig を読み込むようになります。

あとは、必要な数だけ templates/_mypage/ 配下にテンプレートを用意して、ルーティングの定義を追加すれば完了です。

まとめ

Craft CMS では、次の4つのステップを踏むことで、任意のドメインからテンプレートにアクセスできるようになります。

  • .env にベース URL をセット
  • config/general.php にエイリアスをセット
  • config/routes.php にルーティングの指定を追加
  • templates/ 配下にテンプレートファイルを用意

初めて調整しようとしたときは試行錯誤してもなかなか実現できずにいましたが、実はあっさりできてしまうんですね。

なお、_mypage のようにディレクトリ名の接頭辞にアンダースコアを付けておけば、配下のテンプレートへ craftcms.test からもアクセスできないのも便利な仕組みだと思います。