🍧

Next.jsでサブドメインを専用のサブディレクトリで運用する

2024/01/25に公開

Next.jsを使って、さまざまなサブドメインを運用しつつ、サブドメインのときには専用のサブディレクトリにアクセスさせたいときの方法です。ちょっと分かりにくいですね。

  • example.com : 普通のアクセスとして扱う
  • user1.example.com : /subdomain/[user] 以下のパスをルートにする

こういうことをやりたいということです。

middleware.tsを使う

next.config.js でrewriteする方法もあるのですが、条件分岐などをしようと思うと素直にmiddleware.tsで実現するのが良いです。

import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";

const HOST = "example.com:3000";

export function middleware(request: NextRequest) {
  const host = request.headers.get("host");
  const { pathname } = new URL(request.url);
  if (host?.endsWith(`.${HOST}`) && !pathname.startsWith("/_next")) {
    const subdomain = host.replace(`.${HOST}`, "");
    return NextResponse.rewrite(
      new URL(`/subdomain/${subdomain}${pathname}`, request.url),
    );
  }
  return NextResponse.next();
}

export const config = { matcher: "/((?!.*\\.).*)" };

リクエストしてきたホスト名を参照し .example.com:3000 で終わる場合はサブドメイン付きのアクセスと判定します。そしてサブドメインを抜き出して /subdomain/user1 にrewriteしてあげます。以降のパスも継承するようにpathnameも付けておきます。これだけです。

静的なアセットファイル(CSSやJS・画像など)はrewriteしたくないので2つ条件をつけています。 /_next 始まりのパスと、config のマッチャーでpublicディレクトリにあるような画像ファイルなどを除外しています。

たぶんこれで問題なくサブドメインの運用ができるでしょう。たぶん。きっと。

ムーザルちゃんねる

Discussion