示例图片:

代码展示
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// --- 1. 路由优化:支持更优雅的短链接直连 ---
// 允许用户直接访问: https://你的域名.com/img/b/xxxx...
// 而不需要丑陋的: https://你的域名.com/?url=https://blogger.../img/b/xxxx...
let targetUrlStr;
if (url.pathname.startsWith('/img/')) {
targetUrlStr = `https://blogger.googleusercontent.com${url.pathname}${url.search}`;
} else {
// 兼容旧版的 ?url= 用法
targetUrlStr = url.searchParams.get("url");
}
if (!targetUrlStr) {
return new Response("Missing Blogger Image path or URL.", { status: 400 });
}
let targetUrl;
try {
targetUrl = new URL(targetUrlStr);
} catch (e) {
return new Response("Invalid URL format", { status: 400 });
}
// --- 2. 防滥用优化:白名单安全锁 (极度重要) ---
// 仅允许代理 Google/Blogger 的图片域名,防止你的节点被当作免费翻墙下载器
const allowedDomains = [
"blogger.googleusercontent.com",
"1.bp.blogspot.com",
"2.bp.blogspot.com",
"3.bp.blogspot.com",
"4.bp.blogspot.com",
"lh3.googleusercontent.com" // 谷歌相册/Blogger偶尔也会用这个
];
if (!allowedDomains.includes(targetUrl.hostname)) {
return new Response("Forbidden: This proxy is restricted to Blogger images only.", {
status: 403
});
}
// 伪装请求头
const headers = new Headers();
headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
const modifiedRequest = new Request(targetUrl, {
method: request.method,
headers: headers,
redirect: "follow",
});
try {
// --- 3. 终极缓存优化:永久缓存 (1年) ---
// 因为 Blogger 的图片 URL 具备唯一性,我们可以放心大胆地在 CF 节点缓存一整年
const response = await fetch(modifiedRequest, {
cf: {
cacheEverything: true,
cacheTtl: 31536000, // 在 Cloudflare 边缘节点缓存 1 年 (单位:秒)
}
});
// 如果源站返回错误(比如图片被删了),不要缓存这个错误结果
if (!response.ok) {
return response;
}
const newResponse = new Response(response.body, response);
// --- 4. 浏览器端缓存优化 ---
newResponse.headers.set("Access-Control-Allow-Origin", "*");
// 关键:添加 immutable 标记。告诉浏览器这图片永远不变,
// 以后刷新页面连 304 Not Modified 验证请求都不要发,直接从本地硬盘读,做到0延迟!
newResponse.headers.set("Cache-Control", "public, max-age=31536000, immutable");
// 清理可能泄露隐私的 Google 追踪 Cookie
newResponse.headers.delete("Set-Cookie");
newResponse.headers.delete("x-guploader-uploadid");
return newResponse;
} catch (e) {
return new Response("Error fetching Blogger image: " + e.message, { status: 502 });
}
}
};