前期准备:
- CloudFLare账号
- 托管在Cloudflare上面的域名
注意事项:同一个反代建议不要给很多人用,否则流量过大可能违反CF的政策导致被封号。建议小范围自用。
第一步: 部署代码
首先打开Cloudflare面板,在左侧菜单找到 Workers 和 Pages,点击 创建应用程序,模板选Hello word 开始新建一个Worker。

点击 编辑代码,将原有的代码全部删除,粘贴以下代码。
注意:粘贴后,请务必修改代码顶部的 target 这一行,填入你自己想要反代的Emby服务器地址和端口。
const myConfig = {
target: 'https://你的emby地址:端口号',
enableCors: true
};
export default {
async fetch(req, env, ctx) {
const u = new URL(req.url);
const t = new URL(myConfig.target);
u.protocol = t.protocol;
u.hostname = t.hostname;
u.port = t.port;
const h = new Headers(req.headers);
h.set('Host', t.hostname);
if (h.has('Referer')) h.set('Referer', myConfig.target);
if (h.has('Origin')) h.set('Origin', myConfig.target);
const r = new Request(u.toString(), {
method: req.method,
headers: h,
body: req.body,
redirect: 'follow'
});
try {
const res = await fetch(r);
const rh = new Headers(res.headers);
if (myConfig.enableCors) {
rh.set('Access-Control-Allow-Origin', '*');
rh.set('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS');
rh.set('Access-Control-Allow-Headers', '*');
}
return new Response(res.body, {
status: res.status,
statusText: res.statusText,
headers: rh
});
} catch (err) {
return new Response(err.message, { status: 502 });
}
}
};点击右上角的 部署 (Deploy) 按钮保存。
第二步: 域名CNAME优选
打开你托管在Cloudflare的域名管理页面,进入 DNS 记录。
添加一条 CNAME 记录:
名称: 填写你想要的前缀(例如 emby)
目标: 填写一个优选域名。
务必关闭 "小黄云"
优选域名可以在这里选:
https://cf.090227.xyz/

第三步: 配置路由
- 在你的域名管理页面左侧菜单栏,点击 Workers 路由 (Workers Routes)。

- 点击 添加路由。
路由一栏输入: 添加记录的名称.你的域名/*
例如: emby.你的域名.com/*注意!!! 一定要带上/*
Worker 一栏选择你第一步创建的那个Worker。

点击保存。
本教程的优选域名方式也可以用于其它功能的workers,反代代码也可以用于emby服务器以外的网站,想要个性化的功能可以让AI帮你写代码
结束:
现在打开你在DNS设置的那个域名(例如 https://emby.你的域名.com),应该就可以直接访问你的Emby了,并且走的是优选线路。
补充:反代需要使用国内dns解析,否则可能连不上,如果你有同时使用代理软件,请自行添加规则,把你自己的域名走直连,并且DNS要用国内的
补充:在播放器上,服务器端口可以不填(默认443),也可以填443、2053、2083、2087、2096、8443
使用其它端口也许可以在晚高峰提升速度(我不确定). 本方式搭建的反代,使用hills的可以直接在它的服务器线路中添加
进阶:
如果你有多个Emby服务器,想要通过同一个优选域名访问(例如用 /server1 访问第一台,/server2 访问第二台),懒得每个服务器都开一个workers, 可以使用下面的代码。
操作方法:
将Worker中的代码全部替换为以下内容,并修改顶部的配置区域。
const mapCfg = {
paths: {
"/server1": "https://你的第一台emby地址:端口",
"/server2": "https://你的第二台emby地址:端口"
},
main: "https://你的默认emby地址:端口",
cors: true
};
export default {
async fetch(req, env, ctx) {
const rawUrl = new URL(req.url);
let target = mapCfg.main;
let prefix = "";
for (const key in mapCfg.paths) {
if (rawUrl.pathname.startsWith(key)) {
target = mapCfg.paths[key];
prefix = key;
break;
}
}
let cleanPath = rawUrl.pathname;
if (prefix) {
cleanPath = cleanPath.replace(prefix, '');
if (cleanPath === '' || !cleanPath.startsWith('/')) {
cleanPath = '/' + cleanPath;
}
}
const tUrl = new URL(target);
const finalUrl = new URL(cleanPath + rawUrl.search, tUrl);
const h = new Headers(req.headers);
h.set('Host', tUrl.host);
if (h.has('Referer')) h.set('Referer', target);
if (h.has('Origin')) h.set('Origin', target);
const newReq = new Request(finalUrl.toString(), {
method: req.method,
headers: h,
body: req.body,
redirect: 'follow'
});
try {
const res = await fetch(newReq);
const resH = new Headers(res.headers);
if (mapCfg.cors) {
resH.set('Access-Control-Allow-Origin', '*');
resH.set('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
resH.set('Access-Control-Allow-Headers', '*');
}
return new Response(res.body, {
status: res.status,
statusText: res.statusText,
headers: resH
});
} catch (err) {
return new Response(err.message, { status: 502 });
}
}
};使用说明:
- 修改 paths 中的内容,左边是路径前缀,右边是对应的服务器地址。
- 修改 main 中的地址,这是直接访问域名(不带前缀)时连接的默认服务器。
- 在Emby客户端填入地址时:
访问默认服务器填:https://emby.你的域名.com
访问其他服务器填:https://emby.你的域名.com/server1(对应代码里设置的前缀)