技术教程

使用 Cloudflare Workers 反向代理免绑定域名

在寻找低成本甚至零成本的临时测试环境时,许多开发者会选择一些老牌的免费空间,例如法国的 Free.fr 或 Chez.com。这些空间虽然稳定且支持基础环境,但它们通常有一个致命痛点:不支持绑定自定义域名,你只能使用它们提供的二级域名访问。

如果你希望用自己的漂亮域名来访问这些空间,Cloudflare Workers 就是一个完美的解决方案。它不仅能当作免费的反向代理,还能通过 HTMLRewriter 动态修改页面中的链接、图片和脚本路径,避免出现排版错乱或链接失效的问题。

本文将带你一步步通过 Cloudflare Workers 反代 Free.fr 或 Chez.com 等免费空间。

一、 准备工作

  1. 一个 Cloudflare 账号。

  2. 一个已经托管到 Cloudflare 的域名(例如你的自定义域名)。

  3. 你的免费空间源地址(例如 9941.free.fr)。

二、 创建与配置 Cloudflare Worker

  1. 登录 Cloudflare 控制台,在左侧菜单栏点击 Workers & Pages。

  2. 点击 Create application -> Create Worker。

  3. 给你的 Worker 起个名字(例如 free-proxy),点击 Deploy。

  4. 部署成功后,点击 Edit code(编辑代码),将默认的代码清空,并粘贴下方修改好的代理脚本。

三、 Cloudflare Workers 代理脚本

请根据你的实际情况,在代码顶部修改 TARGET_DOMAIN(你的免费空间源域名)和 WORKER_DOMAIN(你绑定在 Worker 上的自定义域名)。

// 定义需要替换的旧域名和新域名
const TARGET_DOMAIN = '9941.free.fr';
const WORKER_DOMAIN = 'fr.cips.pp.ua';
const TARGET_URL = 'http://' + TARGET_DOMAIN;
const WORKER_URL = 'https://' + WORKER_DOMAIN;

// 重写所有 HTML 属性中的 URL
class AttributeRewriter {
    constructor(attributeName) {
        this.attributeName = attributeName;
    }

    element(element) {
        const attribute = element.getAttribute(this.attributeName);
        if (attribute) {
            if (attribute.includes(TARGET_DOMAIN)) {
                element.setAttribute(
                    this.attributeName,
                    attribute.replace(new RegExp(TARGET_URL, 'g'), WORKER_URL)
                );
            }
        }
    }
}

// 重写所有文本内容中的 URL,主要用于处理内联脚本等
class TextRewriter {
    constructor() { }

    text(text) {
        if (text.text.includes(TARGET_DOMAIN)) {
            text.replace(text.text.replace(new RegExp(TARGET_URL, 'g'), WORKER_URL));
        }
    }
}

// 监听所有传入的请求
addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request));
});

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

    const targetUrl = new URL(url.pathname + url.search, TARGET_URL);

    const headers = new Headers(request.headers);
    headers.set('X-Proxy-Host', url.host);
    headers.set('X-Proxy-Proto', url.protocol.replace(':', ''));

    const newRequest = new Request(targetUrl, {
        method: request.method,
        headers: headers,
        body: request.body,
        redirect: 'manual'
    });

    let response = await fetch(newRequest);

    if (response.status >= 300 && response.status < 400) {
        const location = response.headers.get('location');
        if (location && location.includes(TARGET_DOMAIN)) {
            const newLocation = location.replace(TARGET_URL, WORKER_URL);
            response = new Response(response.body, response);
            response.headers.set('location', newLocation);
            return response;
        }
    }

    let newResponse = new Response(response.body, response);
    newResponse.headers.set('access-control-allow-origin', '*');

    const contentType = newResponse.headers.get('content-type') || '';

    if (contentType.includes('text/html')) {
        return new HTMLRewriter()
            .on('a', new AttributeRewriter('href'))
            .on('link', new AttributeRewriter('href'))
            .on('script', new AttributeRewriter('src'))
            .on('img', new AttributeRewriter('src'))
            .on('img', new AttributeRewriter('srcset'))
            .on('form', new AttributeRewriter('action'))
            .on('script', new TextRewriter())
            .transform(newResponse);
    }

    return newResponse;
}

粘贴完成后,点击右上角的 Save and deploy(保存并部署)。

四、 绑定自定义域名

代码部署完成后,我们需要将自己的域名绑定到这个 Worker 上,这里我使用的是之前解析好的cips.pp.ua:

  1. 返回你的 Worker 概览页面,选择 Settings(设置)选项卡。

  2. 点击左侧的 Triggers(触发器)。

  3. 在 Custom Domains(自定义域)区域,点击 Add Custom Domain。

  4. 输入你在脚本中定义的自定义域名(例如 fr.cips.pp.ua,该域名必须已托管在你的 Cloudflare 账号下)。

  5. 点击 Add Custom Domain。Cloudflare 会自动帮你配置好相关的 DNS 解析。

等待几秒钟生效后,你就可以直接通过你自己的自定义域名访问原本不支持绑定域名的 Free.fr 或 Chez.com 空间了!

五、 总结与注意事项

  • 完美适配: 借助 Cloudflare 的 HTMLRewriter,页面中的超链接、静态资源(CSS/JS/图片)以及表单提交地址都会被自动替换为你的自定义域名,极大减少了前端路径报错的问题。

  • 适用场景: 非常适合用于临时测试、部署小型静态或动态网页、API 转发等。

  • 协议注意: 脚本中 TARGET_URL 使用的是 http://(因为部分老牌免费空间不支持 SSL 证书),而 Worker 端通过 Cloudflare 自动提供了全站 HTTPS 加密,兼顾了安全与兼容性。但需要提前在域名的 SSL/TLS 概述中,将 当前加密模式 设置为 灵活 ,才可以实现被反代的域名使用SSL证书访问。

讨论

暂时还没有评论——来发表第一条吧。

发表评论

您正以访客身份浏览网站。请输入姓名和电子邮件,或请注册.

如果验证码难以辨认,请点击图片刷新验证码
评论将根据网站规则发布。规则