58 lines
1.4 KiB
TypeScript
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*',
|
|
}
|