CloudFlare反代网站

CloudFlare反代网站

Fate
2023-01-26 / 0 评论 / 396 阅读 / 正在检测是否收录...

域名反代,实现加速某些网站或者接口。

反代单个域名

addEventListener(
  "fetch",event => {
     let url=new URL(event.request.url);
     url.hostname="raw.githubusercontent.com";  //你需要反代的域名
     let request=new Request(url,event.request);
     event. respondWith(
       fetch(request)
     )
  }
)

反代单个域名

addEventListener('fetch', event => {
  event.respondWith(proxy(event));
});

async function proxy(event) {
  const getReqHeader = (key) => event.request.headers.get(key);

  let url = new URL(event.request.url);
  url.hostname = "raw.githubusercontent.com";

  let parameter = {
    headers: {
      'Host': 'raw.githubusercontent.com',
      'User-Agent': getReqHeader("User-Agent"),
      'Accept': getReqHeader("Accept"),
      'Accept-Language': getReqHeader("Accept-Language"),
      'Accept-Encoding': getReqHeader("Accept-Encoding"),
      'Connection': 'keep-alive',
      'Cache-Control': 'max-age=0'
    }
  };

  if (event.request.headers.has("Referer")) {
    parameter.headers.Referer = getReqHeader("Referer");
  }

  if (event.request.headers.has("Origin")) {
    parameter.headers.Origin = getReqHeader("Origin");
  }

  return fetch(new Request(url, event.request), parameter);
}

反代多个域名

export default {
  async fetch(request, _env) {
      return await handleRequest(request);
  }
}

/**
* Respond to the request
* @param {Request} request
*/
async function handleRequest(request) {
  //请求头部、返回对象
  let reqHeaders = new Headers(request.headers),
      outBody, outStatus = 200, outStatusText = 'OK', outCt = null, outHeaders = new Headers({
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS",
          "Access-Control-Allow-Headers": reqHeaders.get('Access-Control-Allow-Headers') || "Accept, Authorization, Cache-Control, Content-Type, DNT, If-Modified-Since, Keep-Alive, Origin, User-Agent, X-Requested-With, Token, x-access-token"
      });

  try {
      //取域名第一个斜杠后的所有信息为代理链接
      let url = request.url.substr(8);
      url = decodeURIComponent(url.substr(url.indexOf('/') + 1));

      //需要忽略的代理
      if (request.method == "OPTIONS" || url.length < 3 || url.indexOf('.') == -1 || url == "favicon.ico" || url == "robots.txt") {
          //输出提示
          const invalid = !(request.method == "OPTIONS" || url.length === 0)
          outBody = JSON.stringify({
              code: invalid ? 400 : 0,
              usage: 'Host/{URL}',
          });
          outCt = "application/json";
          outStatus = invalid ? 400 : 200;
      }
      else {
          url = fixUrl(url);

          //构建 fetch 参数
          let fp = {
              method: request.method,
              headers: {}
          }

          //保留头部其它信息
          const dropHeaders = ['content-length', 'content-type', 'host'];
          let he = reqHeaders.entries();
          for (let h of he) {
              const key = h[0], value = h[1];
              if (!dropHeaders.includes(key)) {
                  fp.headers[key] = value;
              }
          }

          // 是否带 body
          if (["POST", "PUT", "PATCH", "DELETE"].indexOf(request.method) >= 0) {
              const ct = (reqHeaders.get('content-type') || "").toLowerCase();
              if (ct.includes('application/json')) {
                  fp.body = JSON.stringify(await request.json());
              } else if (ct.includes('application/text') || ct.includes('text/html')) {
                  fp.body = await request.text();
              } else if (ct.includes('form')) {
                  fp.body = await request.formData();
              } else {
                  fp.body = await request.blob();
              }
          }

          // 发起 fetch
          let fr = (await fetch(url, fp));
          outCt = fr.headers.get('content-type');
          outStatus = fr.status;
          outStatusText = fr.statusText;
          outBody = fr.body;
      }
  } catch (err) {
      outCt = "application/json";
      outBody = JSON.stringify({
          code: -1,
          msg: JSON.stringify(err.stack) || err
      });
      outStatus = 500;
  }

  //设置类型
  if (outCt && outCt != "") {
      outHeaders.set("content-type", outCt);
  }

  let response = new Response(outBody, {
      status: outStatus,
      statusText: outStatusText,
      headers: outHeaders
  })

  return response;

  // return new Response('OK', { status: 200 })
}

// 补齐 url
function fixUrl(url) {
  if (url.includes("://")) {
      return url;
  } else if (url.includes(':/')) {
      return url.replace(':/', '://');
  } else {
      return "http://" + url;
  }
}
1

评论

博主关闭了所有页面的评论