利用Cloudfare worker反代github

  1. 绑定你的域名到 cloudflare

  2. 创建一个 worker,并写入如下代码:

    // 反代目标网站.
    const upstream = 'github.com';// 反代目标网站的移动版.
    const upstream_mobile = 'github.com';// 访问区域黑名单(按需设置).
    const blocked_region = [''];// IP地址黑名单(按需设置).
    const blocked_ip_address = ['0.0.0.0', '127.0.0.1'];// 路径替换.
    const replace_dict = {'$upstream': '$custom_domain', // 将"$upstream"替换为"$custom_domain"'//github.com': '' // 移除路径中的"//github.com"
    };addEventListener('fetch', event => {event.respondWith(fetchAndApply(event.request));
    });async function fetchAndApply(request) {const region = request.headers.get('cf-ipcountry').toUpperCase(); // 获取访问者所在的地区const ip_address = request.headers.get('cf-connecting-ip'); // 获取访问者的IP地址const user_agent = request.headers.get('user-agent'); // 获取访问者的User-Agent头部信息let response = null;let url = new URL(request.url);let url_host = url.host;if (url.protocol == 'http:') { // 如果请求协议是HTTP,则重定向到HTTPSurl.protocol = 'https:';response = Response.redirect(url.href);return response;}if (await device_status(user_agent)) { // 判断是否为移动设备var upstream_domain = upstream;} else {var upstream_domain = upstream_mobile;}url.host = upstream_domain;if (blocked_region.includes(region)) { // 检查访问区域是否在黑名单中response = new Response('Access denied: WorkersProxy is not available in your region yet.', {status: 403});} else if (blocked_ip_address.includes(ip_address)){ // 检查IP地址是否在黑名单中response = new Response('Access denied: Your IP address is blocked by WorkersProxy.', {status: 403});} else {let method = request.method;let request_headers = request.headers;let new_request_headers = new Headers(request_headers);new_request_headers.set('Host', upstream_domain); // 设置请求头的Host字段为反代目标网站的域名new_request_headers.set('Referer', url.href); // 设置请求头的Referer字段为当前请求的URLlet original_response = await fetch(url.href, {method: method,headers: new_request_headers});let original_response_clone = original_response.clone();let original_text = null;let response_headers = original_response.headers;let new_response_headers = new Headers(response_headers);let status = original_response.status;// 修改响应头的设置new_response_headers.set('cache-control', 'public, max-age=14400');new_response_headers.set('access-control-allow-origin', '*');new_response_headers.set('access-control-allow-credentials', true);new_response_headers.delete('content-security-policy');new_response_headers.delete('content-security-policy-report-only');new_response_headers.delete('clear-site-data');const content_type = new_response_headers.get('content-type');if (content_type && content_type.includes('text/html') && content_type.includes('UTF-8')) {original_text = await replace_response_text(original_response_clone, upstream_domain, url_host); // 替换响应中的文本内容} else {original_text = original_response_clone.body;}response = new Response(original_text, {status,headers: new_response_headers});}return response;
    }async function replace_response_text(response, upstream_domain, host_name) {let text = await response.text();for (let i in replace_dict) {let j = replace_dict[i];if (i == '$upstream') {i = upstream_domain;} else if (i == '$custom_domain') {i = host_name;}if (j == '$upstream') {j = upstream_domain;} else if (j == '$custom_domain') {j = host_name;}let re = new RegExp(i, 'g');text = text.replace(re, j); // 使用正则表达式替换文本内容}return text;
    }async function device_status(user_agent_info) {var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];var flag = true;for (var v = 0; v < agents.length; v++) {if (user_agent_info.indexOf(agents[v]) > 0) {flag = false;break;}}return flag;
    }
    
  3. 自定义域名,方便访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/681429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react 【二】 setState/react性能优化/dom操作

文章目录 1、setState1.1 setState的三种用法1.2 setState为什么是异步 2、React性能优化2.1 react的更新机制2.2 如何优化性能2.2.1 shouldComponentUpdate2.2.2 PureComponent2.2.3 memo 3、不可变数据的力量4、dom操作4.1 通过ref获取dom的三种方式4.2 执行子组件的方法&…

大模型提示学习、Prompting微调知识

为什么需要提示学习&#xff1f; 提示学习是一种在自然语言处理任务中引入人类编写的提示或示例来辅助模型生成更准确和有意义的输出的技术。以下是一些使用提示学习的原因&#xff1a; 解决模糊性&#xff1a;在某些任务中&#xff0c;输入可能存在歧义或模糊性&#xff0c;通…

【ES】--Elasticsearch的分词器详解

目录 一、前言二、分词器原理1、常用分词器2、ik分词器模式3、指定索引的某个字段进行分词测试3.1、采用ts_match_analyzer进行分词3.2、采用standard_analyzer进行分词三、如何调整分词器1、已存在的索引调整分词器2、特别的词语不能被拆开一、前言 最近项目需求,针对客户提…

Java多线程 继承Thread类

目录 程序 进程 线程多线程实例创建线程测试线程 程序 进程 线程 程序&#xff0c;进程和线程是操作系统中的基本概念&#xff0c;它们在多线程编程中起着重要的作用。 程序&#xff1a;程序是一组指令的集合&#xff0c;用于实现特定的功能。程序通常是静态的&#xff0c;在程…

【开源】基于JAVA+Vue+SpringBoot的班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

Java学习笔记------ArrayList(二)

基本数据类型对应的包装类 byte------Byte、short------Short char------Character、int------Intege long------Long、float------Float double------Double、boolean------Boolean 例如&#xff1a; import java.util.ArrayList; public class test01{public static vo…

Arduino 开发环境

Arduino 刚开始挺简单的&#xff0c;买一块 UNO 或者 Nano&#xff0c;官网下载 IDE &#xff08;在线的就算了&#xff0c;太慢&#xff09;&#xff0c;立即就可以开始编程了&#xff0c;至少让板载 LED 亮起来没问题。这也是 Arduino 亲儿子的优势&#xff0c;省心。 不过你…

云服务器操作系统Windows和Linux镜像有什么区别?

阿里云服务器镜像Windows和Linux操作系统有什么区别&#xff1f;性能有差异吗&#xff1f;有&#xff0c;同配置下Linux性能要优于Windows&#xff0c;但这与阿里云无关&#xff0c;仅仅是linux和windows之间的区别。另外&#xff0c;阿里云提供的windows和linux操作系统均为正…

Java中 HashSet如何判断两个对象是否相等

HashSet如何判断两个对象是否相等 HashSet 是 Java 中的一个类&#xff0c;它实现了 Set 接口。HashSet 中的元素是无序且唯一的&#xff0c;它不保证元素的顺序&#xff0c;也不允许出现重复元素。为了确定两个对象是否相等&#xff0c;HashSet 使用了以下两个方法&#xff1…

LeetCode、338. 比特位计数【简单,位运算】

文章目录 前言LeetCode、338. 比特位计数【中等&#xff0c;位运算】题目链接与分类思路位运算移位处理前缀思想实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java…

Vue3快速上手(三)Composition组合式API及setup用法

一、Vue2的API风格 Vue2的API风格是Options API,也叫配置式API。一个功能的数据&#xff0c;交互&#xff0c;计算&#xff0c;监听等都是分别配置在data, methods&#xff0c;computed, watch等模块里的。如下&#xff1a; <template><div class"person"…

Leetcode 606.根据二叉树创建字符串

给你二叉树的根节点root&#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对"root"表示&#xff0c;转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射…

[ai笔记1] 借着“ai春晚”开个场

1 文思ai笔记-新的开始 今天是2024年2月29日&#xff0c;也是传统农历的除夕夜。早起在ai圈看到一个比较新奇的消息&#xff0c;ai春晚今日举办&#xff0c;竟然有一点小小的激动。这些年确实好久没看过春晚了&#xff0c;自己对于春晚的映像还停留在“白云黑土”、“今天&…

论文解读:MobileOne: An Improved One millisecond Mobile Backbone

论文创新点汇总&#xff1a;人工智能论文通用创新点(持续更新中...)-CSDN博客 论文总结 关于如何提升模型速度&#xff0c;当今学术界的研究往往聚焦于如何将FLOPs或者参数量的降低&#xff0c;而作者认为应该是减少分支数和选择高效的网络结构。 概述 MobileOne(≈MobileN…

react【五】redux/reduxToolkit/手写connext

文章目录 1、回顾纯函数2、redux2.1 redux的基本使用2.2 通过action修改store的数值2.3 订阅state的变化2.4 目录结构2.5 Redux的使用过程2.6 redux的三大原则2.7 Redux官方图 3、redux在React中的使用4、react-redux使用4.1 react-redux的基本使用4.2 异步请求 redux-thunk4.3…

课时26:内容格式化_常用符号解读_终端输出

3.1.2 终端输出 学习目标 这一节&#xff0c;我们从 后台执行、信息符号、小结 三个方面来学习。 后台执行 简介 & 就是将一个命令从前台转到后台执行,使用格式如下&#xff1a;命令 &简单演示 前台执行休眠命令 [rootlocalhost ~]# sleep 4 界面卡住4秒后消失后…

字符串大小比较的方法以及函数的多返回值

1.字符串的大小比较: 按照ASCII码表的值进行比较字符串大小 print(f"abc大于abd,结果为{abc>abd}") #结果为布尔类型False print(f"a大于A,结果为{a>A}") #True print(f"key1大于key2,结果为{key1>key2}") #False 2.函数的多返回值: …

分布式文件系统 SpringBoot+FastDFS+Vue.js

分布式文件系统 SpringBootFastDFSVue.js 一、分布式文件系统1.1.文件系统1.2.什么是分布式文件系统1.3.分布式文件系统的出现1.3.主流的分布式文件系统1.4.分布式文件服务提供商1.4.1.阿里OSS1.4.2.七牛云存储1.4.3.百度云存储 二、fastDFS2.1.fastDSF介绍2.2.为什么要使用fas…

<s-table>、<a-table>接收后端数据

对于 中的 <template #bodyCell“{ column, record }”> &#xff1a; <s-tableref"table":columns"columns":data"loadData":alert"options.alert.show"bordered:row-key"(record) > record.id":tool-config&…

MacOS - M1芯片 Mac 在“恢复”模式中启用系统扩展教程

部分软件需要开启系统扩展才能正常使用&#xff0c;但是默然M1芯片的Mac不能直接打开系统扩展&#xff0c;如下两图。 若要启用系统扩展&#xff0c;您需要在“恢复”环境中修改安全性设置。 若要执行此操作&#xff0c;请将系统关机&#xff0c;然后按住触控ID或电源按钮以开…