This repository has been archived by the owner on Mar 8, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmiddleware.ts
124 lines (119 loc) · 2.58 KB
/
middleware.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
export async function middleware(request: NextRequest) {
const userAgent = request.headers.get('user-agent')
const bots = [
'googlebot',
'yahoo! slurp',
'bingbot',
'yandex',
'baiduspider',
'facebookexternalhit',
'twitterbot',
'rogerbot',
'linkedinbot',
'embedly',
'quora link preview',
'showyoubot',
'outbrain',
'pinterest/0.',
'developers.google.com/+/web/snippet',
'slackbot',
'vkshare',
'w3c_validator',
'redditbot',
'applebot',
'whatsapp',
'flipboard',
'tumblr',
'bitlybot',
'skypeuripreview',
'nuzzel',
'discordbot',
'google page speed',
'qwantify',
'pinterestbot',
'bitrix link preview',
'xing-contenttabreceiver',
'chrome-lighthouse',
'telegrambot',
'integration-test' // Integration testing
]
const IGNORE_EXTENSIONS = [
'.js',
'.css',
'.xml',
'.less',
'.png',
'.jpg',
'.jpeg',
'.gif',
'.pdf',
'.doc',
'.txt',
'.ico',
'.rss',
'.zip',
'.mp3',
'.rar',
'.exe',
'.wmv',
'.doc',
'.avi',
'.ppt',
'.mpg',
'.mpeg',
'.tif',
'.wav',
'.mov',
'.psd',
'.ai',
'.xls',
'.mp4',
'.m4a',
'.swf',
'.dat',
'.dmg',
'.iso',
'.flv',
'.m4v',
'.torrent',
'.woff',
'.ttf',
'.svg',
'.webmanifest'
]
const isBot =
userAgent && bots.some(bot => userAgent.toLowerCase().includes(bot))
const isPrerender = request.headers.get('X-Prerender')
const { pathname } = new URL(request.url)
const extension = pathname.slice(((pathname.lastIndexOf('.') - 1) >>> 0) + 1)
if (
isPrerender ||
!isBot ||
(extension.length && IGNORE_EXTENSIONS.includes(extension))
) {
return NextResponse.next()
}
// Check if request is coming from a bot
if (isBot) {
const newURL = `https://service.prerender.io/${request.url}`
const newHeaders = new Headers(request.headers)
//Do not forget to add your Prerender token as an environment variable
newHeaders.set('X-Prerender-Token', process.env.PRERENDER_TOKEN || '')
const res = await fetch(
new Request(newURL, {
headers: newHeaders,
redirect: 'manual'
})
)
const responseHeaders = new Headers(res.headers)
responseHeaders.set('X-Redirected-From', request.url)
return new Response(res.body, {
status: res.status,
statusText: res.statusText,
headers: responseHeaders
})
}
return NextResponse.next()
}