842 字
4 分钟
Cloudflare Workers 反代任意网站教程
2024-12-07

简介#

Cloudflare Workers 是一个支持 jsproxy 的无服务器函数服务,提供全球 CDN 支持,免费用户每天有 10 万次请求额度。通过简单配置,您可以用它来反向代理任意网站,实现流量中转和访问优化。

Cloudflare 官网:https://www.cloudflare.com

快速实现反代功能#

下面是一段简单的 Cloudflare Workers 脚本,您只需将 example.com 替换为您需要反代的网址即可实现反代。

核心代码#

// 需要反代的网站域名
const upstream = 'example.com';

// 自定义的路径(可选)
const upstream_path = '/';

// 移动设备访问时的反代域名(如与PC端一致可省略修改)
const upstream_mobile = 'example.com';

// 禁用服务的国家/地区
const blocked_region = ['CN', 'US'];

// 禁用服务的IP地址
const blocked_ip_address = ['0.0.0.0', '127.0.0.1'];

// 是否启用HTTPS协议
const https = true;

// 是否禁用缓存
const disable_cache = false;

// 替换文本规则(可根据需求调整)
const replace_dict = {
    '$upstream': '$custom_domain',
    '//example.com': ''
};

// 监听Fetch事件
addEventListener('fetch', event => {
    event.respondWith(fetchAndApply(event.request));
});

// 主逻辑
async function fetchAndApply(request) {
    const region = request.headers.get('cf-ipcountry')?.toUpperCase();
    const ip_address = request.headers.get('cf-connecting-ip');
    const user_agent = request.headers.get('user-agent');
    let response = null;
    let url = new URL(request.url);
    let url_hostname = url.hostname;

    // 设置协议
    url.protocol = https ? 'https:' : 'http:';

    // 判断设备类型
    const upstream_domain = await device_status(user_agent) ? upstream : upstream_mobile;

    // 更新路径和域名
    url.host = upstream_domain;
    url.pathname = url.pathname === '/' ? upstream_path : upstream_path + url.pathname;

    // 区域或IP封锁
    if (blocked_region.includes(region)) {
        return new Response('访问被拒绝:此服务暂未覆盖您的地区。', { status: 403 });
    } else if (blocked_ip_address.includes(ip_address)) {
        return new Response('访问被拒绝:您的IP已被封禁。', { status: 403 });
    }

    // 设置请求头
    const method = request.method;
    const new_request_headers = new Headers(request.headers);
    new_request_headers.set('Host', upstream_domain);
    new_request_headers.set('Referer', `${url.protocol}//${url_hostname}`);

    // 处理请求
    const original_response = await fetch(url.href, {
        method,
        headers: new_request_headers
    });

    // WebSocket连接直接返回
    if (new_request_headers.get("Upgrade")?.toLowerCase() === "websocket") {
        return original_response;
    }

    const original_response_clone = original_response.clone();
    let response_headers = new Headers(original_response.headers);
    let original_text = null;

    // 设置响应头
    if (disable_cache) {
        response_headers.set('Cache-Control', 'no-store');
    }
    response_headers.set('Access-Control-Allow-Origin', '*');
    response_headers.set('Access-Control-Allow-Credentials', 'true');
    ['content-security-policy', 'content-security-policy-report-only', 'clear-site-data'].forEach(header => {
        response_headers.delete(header);
    });

    // 替换文本内容
    const content_type = response_headers.get('content-type');
    if (content_type?.includes('text/html') && content_type.includes('UTF-8')) {
        original_text = await replace_response_text(original_response_clone, upstream_domain, url_hostname);
    } else {
        original_text = original_response_clone.body;
    }

    // 返回最终响应
    return new Response(original_text, {
        status: original_response.status,
        headers: response_headers
    });
}

// 替换响应文本
async function replace_response_text(response, upstream_domain, host_name) {
    let text = await response.text();
    for (const [key, value] of Object.entries(replace_dict)) {
        const search = key === '$upstream' ? upstream_domain : key === '$custom_domain' ? host_name : key;
        const replacement = value === '$upstream' ? upstream_domain : value === '$custom_domain' ? host_name : value;
        text = text.replace(new RegExp(search, 'g'), replacement);
    }
    return text;
}

// 判断设备类型(移动或桌面)
async function device_status(user_agent_info) {
    const agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
    return !agents.some(agent => user_agent_info.includes(agent));
}

如何使用?#

  1. 登录 Cloudflare Workers 管理界面。
  2. 创建一个新的 Worker。
  3. 将代码粘贴到编辑器中。
  4. example.com 替换为您需要反代的目标网站域名。
  5. 保存并部署。

注意事项#

  1. 请求限制:免费账户每天请求上限为 10 万次,超出将暂停服务。
  2. 法律合规:确保您有合法权限对目标网站进行反代。
  3. 性能优化:可以调整缓存和替换规则,提高访问速度。
  4. 安全问题:根据需要添加 IP 和地区封锁,防止滥用。

总结#

通过 Cloudflare Workers,您可以轻松实现反代任意网站的功能,充分利用 Cloudflare 的全球 CDN 加速服务。这种方法适合开发者和企业部署小型代理服务,同时可以根据需求灵活调整配置。

Cloudflare Workers 反代任意网站教程
https://devniko.com/posts/cloudflare-reverseproxy/
作者
Niko
发布于
2024-12-07
许可协议
CC BY-NC-SA 4.0