全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 563|回复: 4

[Windows VPS] 求助,CF workers只反代某个网站的某个路径该怎么写

[复制链接]
发表于 2020-7-26 22:26:27 | 显示全部楼层 |阅读模式
求助,CF workers只反代某个网站的某个路径该怎么写
网上只找到反代整个域的,求助大佬,例如我只想反代 XXX.com/img/路径怎么写
 楼主| 发表于 2020-7-26 22:45:02 | 显示全部楼层
已解决,谷歌到答案了,顺便贴出代码给需要的MJJ
  1. // 你要镜像的网站.
  2. const upstream = 'content.warframe.com'

  3. // 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可.
  4. const upstream_path = '/'

  5. // 镜像站是否有手机访问专用网址,没有则填一样的.
  6. const upstream_mobile = 'content.warframe.com'

  7. // 屏蔽国家和地区.
  8. const blocked_region = ['KP', 'SY', 'PK', 'CU']

  9. // 屏蔽 IP 地址.
  10. const blocked_ip_address = ['0.0.0.0', '127.0.0.1']

  11. // 镜像站是否开启 HTTPS.
  12. const https = true

  13. // 文本替换.
  14. const replace_dict = {
  15.     '$upstream': '$custom_domain',
  16.     '//content.warframe.com': ''
  17. }

  18. // 以下保持默认,不要动
  19. addEventListener('fetch', event => {
  20.     event.respondWith(fetchAndApply(event.request));
  21. })

  22. async function fetchAndApply(request) {

  23.     const region = request.headers.get('cf-ipcountry').toUpperCase();
  24.     const ip_address = request.headers.get('cf-connecting-ip');
  25.     const user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"

  26.     let response = null;
  27.     let url = new URL(request.url);
  28.     let url_hostname = url.hostname;

  29.     if (https == true) {
  30.         url.protocol = 'https:';
  31.     } else {
  32.         url.protocol = 'http:';
  33.     }

  34.     if (await device_status(user_agent)) {
  35.         var upstream_domain = upstream;
  36.     } else {
  37.         var upstream_domain = upstream_mobile;
  38.     }

  39.     url.host = upstream_domain;
  40.     if (url.pathname == '/') {
  41.         url.pathname = upstream_path;
  42.     } else {
  43.         url.pathname = upstream_path + url.pathname;
  44.     }

  45.     if (blocked_region.includes(region)) {
  46.         response = new Response('Access denied: WorkersProxy is not available in your region yet.', {
  47.             status: 403
  48.         });
  49.     } else if (blocked_ip_address.includes(ip_address)) {
  50.         response = new Response('Access denied: Your IP address is blocked by WorkersProxy.', {
  51.             status: 403
  52.         });
  53.     } else {
  54.         let method = request.method;
  55.         let request_headers = request.headers;
  56.         let new_request_headers = new Headers(request_headers);

  57.         new_request_headers.set('Host', url.hostname);
  58.         new_request_headers.set('Referer', url.hostname);

  59.         let original_response = await fetch(url.href, {
  60.             method: method,
  61.             headers: new_request_headers
  62.         })

  63.         let original_response_clone = original_response.clone();
  64.         let original_text = null;
  65.         let response_headers = original_response.headers;
  66.         let new_response_headers = new Headers(response_headers);
  67.         let status = original_response.status;

  68.         new_response_headers.set('access-control-allow-origin', '*');
  69.         new_response_headers.set('access-control-allow-credentials', true);
  70.         new_response_headers.delete('content-security-policy');
  71.         new_response_headers.delete('content-security-policy-report-only');
  72.         new_response_headers.delete('clear-site-data');

  73.         const content_type = new_response_headers.get('content-type');
  74.         if (content_type.includes('text/html') && content_type.includes('UTF-8')) {
  75.             original_text = await replace_response_text(original_response_clone, upstream_domain, url_hostname);
  76.         } else {
  77.             original_text = original_response_clone.body
  78.         }

  79.         response = new Response(original_text, {
  80.             status,
  81.             headers: new_response_headers
  82.         })
  83.     }
  84.     return response;
  85. }

  86. async function replace_response_text(response, upstream_domain, host_name) {
  87.     let text = await response.text()

  88.     var i, j;
  89.     for (i in replace_dict) {
  90.         j = replace_dict[i]
  91.         if (i == '$upstream') {
  92.             i = upstream_domain
  93.         } else if (i == '$custom_domain') {
  94.             i = host_name
  95.         }

  96.         if (j == '$upstream') {
  97.             j = upstream_domain
  98.         } else if (j == '$custom_domain') {
  99.             j = host_name
  100.         }

  101.         let re = new RegExp(i, 'g')
  102.         text = text.replace(re, j);
  103.     }
  104.     return text;
  105. }


  106. async function device_status(user_agent_info) {
  107.     var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
  108.     var flag = true;
  109.     for (var v = 0; v < agents.length; v++) {
  110.         if (user_agent_info.indexOf(agents[v]) > 0) {
  111.             flag = false;
  112.             break;
  113.         }
  114.     }
  115.     return flag;
  116. }
复制代码
发表于 2020-8-25 08:09:22 | 显示全部楼层
xshell 发表于 2020-7-26 22:45
已解决,谷歌到答案了,顺便贴出代码给需要的MJJ

付费帮忙反代一个站 可以?
发表于 2020-8-25 09:45:51 | 显示全部楼层
怎么哪儿都有仓鼠
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-20 03:13 , Processed in 0.062319 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表