返回 AiToEarn
middleware.ts
根目录 / project / aitoearn-web / src / middleware.ts
1 import type { NextRequest } from 'next/server'
2 import acceptLanguage from 'accept-language'
3 import { NextResponse } from 'next/server'
4 import { cookieName, fallbackLng, languages } from '@/app/i18n/settings'
5 import { ProxyUrls } from '@/constant'
6
7 acceptLanguage.languages(languages)
8
9 export const config = {
10 // matcher: '/:lng*'
11 matcher: ['/((?!api|_next/static|_next/image|assets|favicon.ico|sw.js|site.webmanifest).*)'],
12 }
13
14 export function middleware(req: NextRequest) {
15 if (ProxyUrls.find(v => req.nextUrl.pathname.includes(v!))) {
16 return NextResponse.next()
17 }
18 if (
19 [
20 '/robots.txt',
21 '/sitemap.xml',
22 '/sitemap',
23 '/health',
24 '/healthz',
25 '/js/xhs_sign_init.js',
26 '/js/xhs_web_sign.js',
27 '/js/xhs_sign_core.js',
28 '/js/xhs_sign_inject.js',
29 '/shortLink',
30 '/downloads',
31 ].find(v => req.nextUrl.pathname.includes(v!))
32 ) {
33 return NextResponse.next()
34 }
35 if (/^\/sitemap-\d+\.xml$/.test(req.nextUrl.pathname)) {
36 return NextResponse.next()
37 }
38
39 if (req.nextUrl.pathname.includes('icon') || req.nextUrl.pathname.includes('chrome')) {
40 return NextResponse.next()
41 }
42 let lng: string | undefined | null
43 if (req.cookies.has(cookieName))
44 lng = acceptLanguage.get(req.cookies.get(cookieName)?.value)
45 if (!lng)
46 lng = acceptLanguage.get(req.headers.get('Accept-Language'))
47 if (!lng)
48 lng = fallbackLng
49
50 // Redirect if lng in path is not supported
51 if (
52 !languages.some(loc => req.nextUrl.pathname.startsWith(`/${loc}`))
53 && !req.nextUrl.pathname.startsWith('/_next')
54 ) {
55 return NextResponse.redirect(
56 new URL(`/${lng}${req.nextUrl.pathname}${req.nextUrl.search}`, req.url),
57 )
58 }
59
60 if (req.headers.has('referer')) {
61 const refererUrl = new URL(req.headers.get('referer') || '')
62 const lngInReferer = languages.find(l => refererUrl.pathname.startsWith(`/${l}`))
63 const response = NextResponse.next()
64 if (lngInReferer)
65 response.cookies.set(cookieName, lngInReferer)
66 return response
67 }
68 return NextResponse.next()
69 }
70
70 lines TYPESCRIPT