惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
L
LINUX DO - 最新话题
博客园_首页
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
C
Cisco Blogs
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
罗磊的独立博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
A
About on SuperTechFans
G
GRAHAM CLULEY
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
D
DataBreaches.Net
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
AWS News Blog
AWS News Blog
I
InfoQ
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 叶小钗
Project Zero
Project Zero

繁星点点

最新轻量级龙虾部署教程 通过netboot.xyz重装系统 giffgaff卡保号教程 Llinux系统中全新透明代理方案(可代理所有出站流量) tailscale开启子网路由常见的坑 OpenWrt固件编译 解决UFW和Docker的问题 使用PGP的非对称算法加密文件 NSSM工具把任意exe程序注册为Windows后台服务 轻量级简约端口转发rinetd 安卓IDE的安装和使用 IP信息查询网站汇总 热点共享代理教程 SSH使用密钥认证登录详细解释 Debian系统公网IP出口切换指南,适用多IP服务器 Windows系统安装Scoop包管理器 安卓Flutter开发学习笔记 使用手机搭建节点服务端 关于github提交记录泄露真实邮箱的处理办法 anytls协议部署教程 caddy给域名用上ECH加密 通过gitlab流水线自动备份仓库 低配机器使用alpine系统跑docker 端口敲门教程 3x-ui面板通过api管理示例 nmap端口扫描 数据库常用命令 snap和winget包管理器 Git推送GitHub常用命令 😩😩😩学不完,根本学不完😩😩😩 使用CDN后获取访客真实IP 一些用于网络测试的下载测速文件 纯v6网络访问v4站点最简单的方法 服务器配置SSH密钥登录 windows重装系统教程 Docker部署哪吒监控 Github-Actions默认用户变量GITHUB_TOKEN的提权语法 给站点套CFT的一些坑 解决CF反代Docker失效的问题 使用py3快速启动一个文件上传和下载的接口 ios系统最新免拔卡使用tiktok方法 clash手搓配置最全协议示例详解 为IP地址申请免费证书并开启HTTPS 实用网站收藏 纯CSS实现剧透效果 在CloudflareWAF中屏蔽国内浏览器 网络安全之百度URL欺骗漏洞分析和复现 超级强大的ansible批量管理主机运维工具使用教程 收集整理的最新的常用VPS脚本工具 无法注册TG账号和国内号码接收不到验证码详细解决方案 国内环境安装xui面板 免费接码网站合集 完整的网络状态码列表 关于xui面板报错无法监听127.0.0.1:62789的问题 Xboard面板常见问题 项目编译构建文档 ios最新美区ID注册方法 V2board前后端分离 Markdown语法教程 Github加速 Docker镜像加速和离线安装 Liunx配置wrap 代理工具和SSH工具推荐 常用代码记录
通过CF-Workers代理访问网站
2025-04-15 · via 繁星点点

直接贴代码

建议只自己使用,不要公开,否则可能被判断为涉嫌违反CF规则

addEventListener("fetch", event => {
  let url = new URL(event.request.url);
  url.hostname = "hub.docker.com"; // 修改成需要代理的网站

  // 获取请求头中的 User-Agent
  let userAgent = event.request.headers.get("User-Agent");

  // 屏蔽爬虫和搜索引擎的列表
  const blockedUserAgents = [
    /googlebot/i,
    /bingbot/i,
    /baiduspider/i,
    /slurp/i,
    /duckduckbot/i,
    /yandex/i,
    /sogou/i,
    /exabot/i,
    /facebot/i,
    /facebookexternalhit/i
  ];

  const isBot = blockedUserAgents.some(pattern => pattern.test(userAgent));

  if (isBot) {
    // 如果是爬虫或搜索引擎,返回 403 Forbidden
    return event.respondWith(
      new Response('访问被拒绝', { status: 403 })
    );
  }

  // 构建新的请求头,传递原请求头,并处理必要的字段
  let headers = new Headers(event.request.headers);
  headers.set('X-Forwarded-For', event.request.headers.get('cf-connecting-ip') || 'unknown');

  // 创建新的请求对象
  let request = new Request(url, {
    method: event.request.method,           // 保留原请求方法
    headers: headers,                       // 保留原请求头
    body: event.request.method === 'GET' ? null : event.request.body, // 对于 GET 请求,Body 通常是空的
    redirect: 'follow'                      // 自动跟随重定向
  });

  console.log(`请求: ${url}`);

  // 处理请求并返回响应
  event.respondWith(
    fetch(request)
      .then(response => {
        // 返回原始响应,没有缓存控制
        console.log(`响应状态: ${response.status}`);
        return response;
      })
      .catch(err => {
        // 处理请求失败的情况
        console.error('请求失败:', err);
        return new Response('请求失败', { status: 502 });
      })
  );
});

增加访问限制密码认证

addEventListener("fetch", event => {
  // 设定一个简单的用户名和密码
  const validUsername = "user";
  const validPassword = "mypassword";

  // 获取请求头中的 Authorization
  const authHeader = event.request.headers.get("Authorization");

  // 检查 Cookie 是否存在认证标记
  const cookie = event.request.headers.get("Cookie");
  const isAuthenticated = cookie && cookie.includes("authenticated=true");

  // 如果没有 Cookie 标记,且没有 Authorization 头或者它不符合 Basic Authentication 格式
  if (!isAuthenticated && (!authHeader || !authHeader.startsWith("Basic "))) {
    return event.respondWith(
      new Response("需要认证才能访问", {
        status: 401,
        headers: {
          "WWW-Authenticate": 'Basic realm="请输入用户名和密码"' // 触发浏览器认证对话框
        }
      })
    );
  }

  // 如果用户已经认证过,跳过认证步骤
  if (isAuthenticated) {
    return handleRequest(event);
  }

  // 提取并解码用户名和密码
  const base64Credentials = authHeader.split(" ")[1];
  const credentials = atob(base64Credentials);
  const [username, password] = credentials.split(":");

  // 检查用户名和密码是否正确
  if (username === validUsername && password === validPassword) {
    // 设置 Cookie,标记用户已认证,并设置 6 小时过期
    const headers = new Headers();
    headers.set('Set-Cookie', 'authenticated=true; Path=/; Max-Age=21600'); // 6 小时过期

    return event.respondWith(
      new Response("认证成功!请刷新此页面继续访问。", {
        status: 200,
        headers: headers
      })
    );
  } else {
    // 如果认证失败,返回 401 Unauthorized 并提示
    return event.respondWith(
      new Response("认证失败", {
        status: 401,
        headers: {
          "WWW-Authenticate": 'Basic realm="请输入用户名和密码"' // 触发浏览器认证对话框
        }
      })
    );
  }

  function handleRequest(event) {
    let url = new URL(event.request.url);
    url.hostname = "hub.docker.com"; // 修改成需要代理的网站

    // 获取请求头中的 User-Agent
    let userAgent = event.request.headers.get("User-Agent");

    // 屏蔽爬虫和搜索引擎的列表
    const blockedUserAgents = [
      /googlebot/i,
      /bingbot/i,
      /baiduspider/i,
      /slurp/i,
      /duckduckbot/i,
      /yandex/i,
      /sogou/i,
      /exabot/i,
      /facebot/i,
      /facebookexternalhit/i
    ];

    const isBot = blockedUserAgents.some(pattern => pattern.test(userAgent));

    // 如果是爬虫或搜索引擎,返回 403 Forbidden
    if (isBot) {
      return event.respondWith(
        new Response('访问被拒绝', { status: 403 })
      );
    }

    // 构建新的请求头,传递原请求头,并处理必要的字段
    let headers = new Headers(event.request.headers);
    headers.set('X-Forwarded-For', event.request.headers.get('cf-connecting-ip') || 'unknown'); // 可以添加客户端 IP

    // 创建新的请求对象
    let request = new Request(url, {
      method: event.request.method,           // 保留原请求方法
      headers: headers,                       // 保留原请求头
      body: event.request.method === 'GET' ? null : event.request.body, // 对于 GET 请求,Body 通常是空的
      redirect: 'follow'                      // 自动跟随重定向
    });

    console.log(`请求: ${url}`);

    // 处理请求并返回响应
    event.respondWith(
      fetch(request)
        .then(response => {
          // 返回原始响应,没有缓存控制
          console.log(`响应状态: ${response.status}`);
          return response;
        })
        .catch(err => {
          // 处理请求失败的情况
          console.error('请求失败:', err);
          return new Response('请求失败', { status: 502 });
        })
    );
  }
});

代理访问所有直链

通过动态传入域名的方式,例如:https://test.workers.dev/https://api.github.com

addEventListener("fetch", event => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  const originalUrl = new URL(request.url);
  const path = originalUrl.pathname;

  // 检查是否正确传入目标地址
  if (!path.startsWith("/http://") && !path.startsWith("/https://")) {
    return new Response("请正确传入目标地址,需要带协议头。", { status: 400 });
  }

  const targetUrl = path.slice(1) + originalUrl.search; // 构造完整目标 URL
  let url;
  try {
    url = new URL(targetUrl);
  } catch (e) {
    return new Response("无效的目标 URL", { status: 400 });
  }

  // 防爬虫:拦截常见 User-Agent
  const userAgent = request.headers.get("User-Agent") || "";
  const blockedAgents = [
    /googlebot/i, /bingbot/i, /baiduspider/i, /slurp/i,
    /duckduckbot/i, /yandex/i, /sogou/i, /exabot/i,
    /facebot/i, /facebookexternalhit/i
  ];
  if (blockedAgents.some(re => re.test(userAgent))) {
    return new Response("访问被拒绝", { status: 403 });
  }

  // 构造代理请求
  const proxyRequest = new Request(url.toString(), {
    method: request.method,
    headers: cleanHeaders(request.headers),
    body: request.method === "GET" || request.method === "HEAD" ? null : request.body,
    redirect: "follow"
  });

  try {
    const response = await fetch(proxyRequest);

    // 克隆响应头并清理 CSP、X-Frame-Options 等阻止代理的问题
    const newHeaders = new Headers(response.headers);
    newHeaders.delete("content-security-policy");
    newHeaders.delete("content-security-policy-report-only");
    newHeaders.delete("x-frame-options");
    newHeaders.set("Access-Control-Allow-Origin", "*");
    newHeaders.set("Access-Control-Allow-Headers", "*");
    newHeaders.set("Access-Control-Allow-Methods", "*");

    return new Response(response.body, {
      status: response.status,
      statusText: response.statusText,
      headers: newHeaders
    });
  } catch (err) {
    return new Response("代理请求失败: " + err.message, { status: 502 });
  }
}

// 清理 headers(避免 host、encoding 等引发问题)
function cleanHeaders(headers) {
  const newHeaders = new Headers();
  for (const [key, value] of headers.entries()) {
    const lower = key.toLowerCase();
    if (
      lower === "host" ||
      lower === "cf-connecting-ip" ||
      lower === "x-forwarded-for" ||
      lower === "x-real-ip" ||
      lower === "content-length"
    ) {
      continue;
    }
    newHeaders.set(key, value);
  }
  return newHeaders;
}