Repository navigation
Expand file tree
/
Copy pathworker.js
More file actions
80 lines (72 loc) · 3.2 KB
/
Copy pathworker.js
File metadata and controls
80 lines (72 loc) · 3.2 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// User agents handled by Prerender
const BOT_AGENTS = [
// Search Engines
"googlebot", "adsbot-google", "apis-google", "mediapartners-google",
"google-safety", "feedfetcher-google", "googleproducer", "google-site-verification",
"bingbot", "yandexbot", "yabrowser", "yahoo", "baiduspider", "naver",
"seznambot", "sznprohlizec", "qwantbot", "ecosia", "duckduckbot",
"duckassistbot", "applebot",
// Social Media
"facebookexternalhit", "facebookcatalog", "facebookbot", "meta-externalagent",
"twitterbot", "linkedinbot", "whatsapp", "slackbot", "pinterest", "pinterestbot",
"tiktok", "tiktokspider", "bytespider", "discordbot",
// SEO Tools
"semrushbot", "ahrefsbot", "chrome-lighthouse", "screaming-frog",
"oncrawlbot", "botifybot", "deepcrawl", "lumar", "rogerbot", "dotbot",
// AI Bots
"gptbot", "chatgpt", "oai-searchbot", "chatgpt-user", "claudebot",
"google-extended", "perplexitybot", "perplexity-user", "youbot",
"amazonbot", "anthropic-ai", "claude-web", "claude-user", "ccbot", "mistralai-user",
// Other Known Bots & Crawlers
"embedly", "quora link preview", "showyoubot", "outbrain", "pinterest/0.",
"developers.google.com/+/web/snippet", "vkshare", "w3c_validator", "redditbot",
"flipboard", "tumblr", "bitlybot", "skypeuripreview", "nuzzel",
"google page speed", "qwantify", "bitrix link preview", "xing-contenttabreceiver",
"google-inspectiontool", "telegrambot",
// Testing
"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",
];
export default {
async fetch(request, env, ctx) {
// Safety net for anything thrown outside the catch below - Cloudflare serves the
// origin response instead of its own error page.
ctx.passThroughOnException();
return await handleRequest(request, env).catch((err) => {
// Fail open: log for Worker logs, then serve the origin instead of a 500 + stack trace.
console.error(err);
return fetch(request);
});
},
};
async function handleRequest(request, env) {
const url = new URL(request.url);
const userAgent = request.headers.get("User-Agent")?.toLowerCase() || "";
const isPrerender = request.headers.get("X-Prerender");
const pathName = url.pathname.toLowerCase();
const lastDot = pathName.lastIndexOf(".");
const extension = lastDot > -1 ? pathName.substring(lastDot).toLowerCase() : "";
if (
isPrerender ||
!BOT_AGENTS.some((bot) => userAgent.includes(bot.toLowerCase())) ||
(extension.length && IGNORE_EXTENSIONS.includes(extension))
) {
return fetch(request);
}
const newURL = `https://service.prerender.io/${request.url}`;
const newHeaders = new Headers(request.headers);
newHeaders.set("X-Prerender-Token", env.PRERENDER_TOKEN);
newHeaders.set("X-Prerender-Int-Type", "CloudFlare");
return fetch(new Request(newURL, {
headers: newHeaders,
redirect: "manual",
}));
}