利用Cloud flare Worker搭建图片代理代码V2

       利用Cloudflare    worker搭建的图片代理,使用格式类似于https://wsrv.nl/?url=
      示例图片:
代码展示
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 });
    }
  }
};