website-monitor/frontend/middleware.ts

58 lines
1.4 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
const LANDING_ALLOWED_PATHS = ['/', '/blog', '/privacy', '/admin', '/use-cases', '/features']
const NEXT_METADATA_PATHS = [
'/favicon.ico',
'/icon',
'/apple-icon',
'/opengraph-image',
'/twitter-image',
]
function isAllowedLandingPath(pathname: string): boolean {
if (pathname === '/') return true
return LANDING_ALLOWED_PATHS
.filter((path) => path !== '/')
.some((path) => pathname === path || pathname.startsWith(`${path}/`))
}
function isStaticOrMetadataPath(pathname: string): boolean {
// Never treat API routes as static paths
if (pathname.startsWith('/api')) return false
if (pathname.startsWith('/_next')) return true
if (/\.[^/]+$/.test(pathname)) return true
return NEXT_METADATA_PATHS.some(
(path) => pathname === path || pathname.startsWith(`${path}/`)
)
}
export function middleware(request: NextRequest) {
if (process.env.NEXT_PUBLIC_LANDING_ONLY_MODE !== 'true') {
return NextResponse.next()
}
const { pathname } = request.nextUrl
if (isStaticOrMetadataPath(pathname)) {
return NextResponse.next()
}
if (isAllowedLandingPath(pathname)) {
return NextResponse.next()
}
const redirectUrl = request.nextUrl.clone()
redirectUrl.pathname = '/'
redirectUrl.search = ''
return NextResponse.redirect(redirectUrl, 307)
}
export const config = {
matcher: '/:path*',
}