-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathproxy.ts
More file actions
63 lines (53 loc) · 2.72 KB
/
Copy pathproxy.ts
File metadata and controls
63 lines (53 loc) · 2.72 KB
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
import { NextResponse, type NextRequest } from "next/server";
export async function proxy(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", "oai-searchbot", "chatgpt", "gptbot",
"perplexity", "claudebot", "amazonbot", "integration-test", "iframely",
];
const IGNORE_EXTENSIONS = [
".js", ".css", ".xml", ".less", ".png", ".jpg", ".jpeg", ".gif", ".pdf",
".doc", ".txt", ".ico", ".rss", ".zip", ".mp3", ".rar", ".exe", ".wmv",
".avi", ".ppt", ".mpg", ".mpeg", ".tif", ".wav", ".mov", ".psd", ".ai",
".xls", ".mp4", ".m4a", ".swf", ".dat", ".dmg", ".iso", ".flv", ".m4v",
".torrent", ".woff", ".woff2", ".ttf", ".otf", ".eot", ".svg", ".webp",
".avif", ".webmanifest",
];
const isBot = !!userAgent && bots.some((bot) => userAgent.toLowerCase().includes(bot.toLowerCase()));
const isPrerender = request.headers.get("X-Prerender");
const pathname = new URL(request.url).pathname;
// `extension` already includes the leading dot (e.g. ".woff2"), or "" for dotless paths.
const extension = pathname.slice(((pathname.lastIndexOf(".") - 1) >>> 0) + 1).toLowerCase();
const hasExtension = extension.length > 0;
if (isPrerender || !isBot || (hasExtension && IGNORE_EXTENSIONS.includes(extension))) {
return NextResponse.next();
}
const newURL = `http://service.prerender.io/${request.url}`;
const newHeaders = new Headers(request.headers);
newHeaders.set("X-Prerender-Token", process.env.PRERENDER_TOKEN ?? "");
newHeaders.set("X-Prerender-Int-Type", "NextJS");
try {
const res = await fetch(new Request(newURL, { headers: newHeaders, redirect: "manual" }));
const responseHeaders = new Headers(res.headers);
responseHeaders.set("X-Redirected-From", request.url);
responseHeaders.delete("content-encoding");
responseHeaders.delete("content-length");
responseHeaders.delete("transfer-encoding");
const { readable, writable } = new TransformStream();
if (res.body) res.body.pipeTo(writable);
return new NextResponse(readable, {
status: res.status,
statusText: res.statusText,
headers: responseHeaders,
});
} catch {
return NextResponse.next();
}
}