middleware.tsx

 avatar
unknown
typescript
10 months ago
2.5 kB
6
Indexable
import { NextRequest, NextResponse } from "next/server";
import { getToken } from "next-auth/jwt";

export const config = {
  matcher: [
    /*
     * Match all paths except for:
     * 1. /api routes
     * 2. /_next (Next.js internals)
     * 3. /_static (inside /public)
     * 4. all root files inside /public (e.g. /favicon.ico)
     */
    "/((?!api/|_next/|_static/|_public/|_vercel|[\\w-]+\\.\\w+|images/|videos/).*)",
  ],
};

export default async function middleware(req: NextRequest) {
  const url = req.nextUrl;

  // Get hostname of request (e.g. demo.vercel.pub, demo.localhost:3000)
  let hostname = req.headers
    .get("host")!
    .replace(".localhost:3000", `.${process.env.NEXT_PUBLIC_ROOT_DOMAIN}`);

  // special case for Vercel preview deployment URLs
  if (
    hostname.includes("---") &&
    hostname.endsWith(`.${process.env.NEXT_PUBLIC_VERCEL_DEPLOYMENT_SUFFIX}`)
  ) {
    hostname = `${hostname.split("---")[0]}.${
      process.env.NEXT_PUBLIC_ROOT_DOMAIN
    }`;
  }

  const searchParams = req.nextUrl.searchParams.toString();
  // Get the pathname of the request (e.g. /, /about, /blog/first-post)
  const path = `${url.pathname}${
    searchParams.length > 0 ? `?${searchParams}` : ""
  }`;

  // rewrites for app pages
  if (
    hostname == `app.${process.env.NEXT_PUBLIC_ROOT_DOMAIN}` ||
    hostname == `app.dev.${process.env.NEXT_PUBLIC_ROOT_DOMAIN}` ||
    hostname == "localhost:8888"
  ) {
    const session = await getToken({
      req,
    });

    if (!session && path !== "/login") {
      console.log("Need to redirect to /login", hostname);
      return NextResponse.redirect(new URL("/login", req.url));
    } else if (session && path == "/login") {
      console.log("Need to redirect to /home", hostname);
      return NextResponse.redirect(new URL("/", req.url));
    }

    console.log("Need to rewrite app to /app folder", hostname);

    return NextResponse.rewrite(
      new URL(`/app${path === "/" ? "" : path}`, req.url),
    );
  }

  console.log("Need to rewrite root application to home folder", hostname);
  // rewrite root application to `/home` folder
  if (
    hostname === "localhost:3000" ||
    hostname === process.env.NEXT_PUBLIC_ROOT_DOMAIN
  ) {
    return NextResponse.rewrite(
      new URL(`/home${path === "/" ? "" : path}`, req.url),
    );
  }

  console.log("Need to rewrite to /[domain]/[slug]", hostname);
  // rewrite everything else to `/[domain]/[slug] dynamic route
  return NextResponse.rewrite(new URL(`/${hostname}${path}`, req.url));
}
Editor is loading...
Leave a Comment