使用 Cloudflare Workers 反向代理免绑定域名
在寻找低成本甚至零成本的临时测试环境时,许多开发者会选择一些老牌的免费空间,例如法国的 Free.fr 或 Chez.com。这些空间虽然稳定且支持基础环境,但它们通常有一个致命痛点:不支持绑定自定义域名,你只能使用它们提供的二级域名访问。
如果你希望用自己的漂亮域名来访问这些空间,Cloudflare Workers 就是一个完美的解决方案。它不仅能当作免费的反向代理,还能通过 HTMLRewriter 动态修改页面中的链接、图片和脚本路径,避免出现排版错乱或链接失效的问题。
本文将带你一步步通过 Cloudflare Workers 反代 Free.fr 或 Chez.com 等免费空间。
一、 准备工作
-
一个 Cloudflare 账号。
-
一个已经托管到 Cloudflare 的域名(例如你的自定义域名)。
-
你的免费空间源地址(例如
9941.free.fr)。
二、 创建与配置 Cloudflare Worker
-
登录 Cloudflare 控制台,在左侧菜单栏点击 Workers & Pages。
-
点击 Create application -> Create Worker。
-
给你的 Worker 起个名字(例如
free-proxy),点击 Deploy。 -
部署成功后,点击 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:
-
返回你的 Worker 概览页面,选择 Settings(设置)选项卡。
-
点击左侧的 Triggers(触发器)。
-
在 Custom Domains(自定义域)区域,点击 Add Custom Domain。
-
输入你在脚本中定义的自定义域名(例如
fr.cips.pp.ua,该域名必须已托管在你的 Cloudflare 账号下)。 -
点击 Add Custom Domain。Cloudflare 会自动帮你配置好相关的 DNS 解析。
等待几秒钟生效后,你就可以直接通过你自己的自定义域名访问原本不支持绑定域名的 Free.fr 或 Chez.com 空间了!
五、 总结与注意事项
-
完美适配: 借助 Cloudflare 的
HTMLRewriter,页面中的超链接、静态资源(CSS/JS/图片)以及表单提交地址都会被自动替换为你的自定义域名,极大减少了前端路径报错的问题。 -
适用场景: 非常适合用于临时测试、部署小型静态或动态网页、API 转发等。
-
协议注意: 脚本中
TARGET_URL使用的是http://(因为部分老牌免费空间不支持 SSL 证书),而 Worker 端通过 Cloudflare 自动提供了全站 HTTPS 加密,兼顾了安全与兼容性。但需要提前在域名的 SSL/TLS 概述中,将 当前加密模式 设置为 灵活 ,才可以实现被反代的域名使用SSL证书访问。