前期准备:

  1. CloudFLare账号
  2. 托管在Cloudflare上面的域名

注意事项:
同一个反代建议不要给很多人用,否则流量过大可能违反CF的政策导致被封号。建议小范围自用。

第一步: 部署代码

首先打开Cloudflare面板,在左侧菜单找到 Workers 和 Pages,点击 创建应用程序,模板选Hello word 开始新建一个Worker。
pasted-1768645431735.png
点击 编辑代码,将原有的代码全部删除,粘贴以下代码。

注意:粘贴后,请务必修改代码顶部的 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/
pasted-1768651654904.png

第三步: 配置路由

  1. 在你的域名管理页面左侧菜单栏,点击 Workers 路由 (Workers Routes)。
    pasted-1768671950226.png
  2. 点击 添加路由。
    路由一栏输入: 添加记录的名称.你的域名/*
    例如: emby.你的域名.com/*
    注意!!! 一定要带上/*
    Worker 一栏选择你第一步创建的那个Worker。
    pasted-1768671887817.png

点击保存。

本教程的优选域名方式也可以用于其它功能的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 });
  }
 }
};

使用说明:

  1. 修改 paths 中的内容,左边是路径前缀,右边是对应的服务器地址。
  2. 修改 main 中的地址,这是直接访问域名(不带前缀)时连接的默认服务器。
  3. 在Emby客户端填入地址时:
    访问默认服务器填: https://emby.你的域名.com
    访问其他服务器填: https://emby.你的域名.com/server1 (对应代码里设置的前缀)