nino
  • ドキュメント
  • レジストリ
  • メンバーシップ

Command Palette

Search for a command to run...

スポンサー
メニュー

Proxy.ts

 

1分 45秒

Proxy は主にログイン状態に応じた画面のリダイレクトや翻訳など基盤にまつわる処理を行います。

Loading...

ログイン状態に応じたリダイレクト

ほとんどの画面が要認証である場合、許可制のルート定義を行います。(保護したい画面ではなく、誰でもみれる画面を定義する)正規表現を用いることで特定のパス配下の画面をまとめて許可することもできます。

matcher

明確な最適解がない状態ですが、現状最もシンプルなのは

  • ルートハンドラー
  • 静的ファイル
  • 拡張子を含むURL

を除く指定です。

Loading...
Discord で質問する
何か気になったこと、分からないことがあれば気軽に質問してください!
DiscordDiscordで質問する
nino

Developer

XXGitHubGitHubYouTubeYouTubeZennZennDiscordDiscord

    リンク

  • ドキュメント
  • レジストリ
  • アーキテクチャ

    ツール

  • フィード
  • ステータス

    ポリシー

  • 利用規約
  • プライバシーポリシー
  • 特定商取引法に基づく表示
ドキュメント
はじめに
  • Changelog
ガイド
  • Webアプリの環境構築
  • ニュース収集&AI要約
  • Turso のテーブル移行
  • 日時の管理
  • 中規模のリストをブラウザにキャッシュし、クライアントでフィルタする
  • Search Params Dialog
  • コードの整理
  • AGENTS.md
  • Better Auth
  • プロダクト開発ポリシー
  • 推奨ツール
  • Proxy.ts
  • 多言語対応
  • SWR
  • Cache Component
  • Next.js の課題、不具合
  • アプリ開発フロー
  • プロンプトガイド
  • CSS Tips
  • Font Family
  • セルフブランディング
  • セルフオンボーディング
  • オフィスツール
  • Email
  • Breadcrumb(パンくず)
  • 並べ替え
import { getSessionCookie } from "better-auth/cookies";
import { type NextRequest, NextResponse } from "next/server";

const publicRoutes = ["/", /\/pets\/(?!new).*/];
const guestOnlyRoutes = [
  "/login",
  "/signup",
  "/reset-password",
  "/request-password-reset",
];

export async function proxy(request: NextRequest) {
  const sessionCookie = getSessionCookie(request);
  const pathname = request.nextUrl.pathname;
  const isPublicRoute = publicRoutes.some((route) => {
    if (typeof route === "string") {
      return route === pathname;
    }
    return route.test(pathname);
  });
  const isGuestRoute = guestOnlyRoutes.includes(pathname);
  const isPrivateRoute = !isGuestRoute && !isPublicRoute;

  if (isGuestRoute && sessionCookie) {
    const redirectTo = request.nextUrl.searchParams.get("redirect") || "/";
    return NextResponse.redirect(new URL(redirectTo, request.url));
  }

  if (isPrivateRoute && !sessionCookie) {
    const redirectUrl = new URL("/login", request.url);
    redirectUrl.searchParams.set("redirect", request.nextUrl.pathname);
    return NextResponse.redirect(redirectUrl);
  }

  return NextResponse.next();
}

export const config = {
  // API ルート、静的ファイル(static)、Next.jsの内部ファイル(_next)、および拡張子を含むパス(例: .png, .jpg, .css など)を除外し、全てのページルートにミドルウェアを適用します。
  // .*\\..* は「ドットを含む任意のファイル名(拡張子付きのファイル)」を意味します。
  matcher: "/((?!api|static|.*\\..*|_next).*)",
};
matcher: "/((?!api|static|.*\\..*|_next).*)",