碎碎念

近期经常因为学习一些内容,经常克隆一些仓库,但是服务器上克隆github的速度确实有点不理想,恰好朋友颢天出了一篇文章,感觉很实用,于是我尝试部署了一下,速度确实有所提升,于是在此分享给大家!

原理

转发工具的原理基于网络请求的代理机制。它作为一个中介,接收客户端的请求,然后将其转发到目标服务器,并最终将目标服务器的响应返回给客户端。想象一下,你在网上想访问一个网站,但是直接访问有点麻烦,可能是因为网站有安全设置,或者是因为网络限制。这时候,转发工具就像是一个友好的中间人,它帮你去敲那扇门。

  1. 你提出请求:你对中间人说,“嘿,帮我去那个网站看看。” 这就是你向转发工具发送的请求。
  2. 中间人帮忙:中间人听到你的请求后,就跑到那个网站去敲门,帮你问问题或者拿东西。
  3. 处理一下:在去敲门之前,中间人可能会检查一下你给的信息,看看有没有什么需要改的,比如换个说法或者加个帽子(修改请求头)。
  4. 敲门:中间人拿着你的信息去到那个网站,然后按照你的要求去请求信息。
  5. 拿回应答:网站回应了中间人,给了他一些信息或者数据。
  6. 可能再处理一下:中间人拿到回应后,可能会再检查一遍,看看有没有什么需要调整的,比如换个包装(修改响应头)。
  7. 给你回应:最后,中间人把网站给的回应带给你,你就得到了你想要的信息。
  8. 记个小本本:有时候,中间人还会把这次帮忙的过程记下来,以后可以看看都帮了什么忙,或者出了问题可以查一查。

转发工具就像是这个中间人,它帮助用户更方便地访问网站,同时也可能帮助用户绕过一些访问限制,或者保护用户的隐私。整个过程就像是通过一个友好的邻居去帮你跑腿一样简单。

反向代理转发

教程

所需工具

  1. cloudflare账号
  2. Name Servicecloudflare的一个域名

创建CF-Worker

打开Cloudflare侧边栏中的Workers and Pages -> 概述,进入worker控制面板

概述

选择创建应用程序,创建你的第一个反向代理加速器,下一个页面继续点创建,这里不再放图片。

创建

到部署hello World脚本部分,你可以修改名称后,点击右下角部署进行下一步

创建

到下一步后,我们的worker就创建好了,下面点击修改代码

点击编辑代码旋蒸

通用转发

下面是通用转发接口,适用于所有加速服务,编辑左侧代码使其转发网站内容,源代码来自于颢天,我将其稍加修改,将主页设置为介绍文档,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
const specialCases = {
"*": {
"Origin": "DELETE",
"Referer": "DELETE"
}
}
function handleSpecialCases(request) {
const url = new URL(request.url);
const rules = specialCases[url.hostname] || specialCases["*"];
for (const [key, value] of Object.entries(rules)) {
switch (value) {
case "KEEP":
break;
case "DELETE":
request.headers.delete(key);
break;
default:
request.headers.set(key, value);
break;
}
}
}
async function handleRequest(request) {
const url = new URL(request.url);
if (url.pathname === "/") {
return new Response(`<!DOCTYPE html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<title>转发服务使用指南</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background: #f4f4f4;
}

.container {
width: 80%;
margin: auto;
overflow: hidden;
}

header {
background: #333;
color: #fff;
padding: 20px;
text-align: center;
}

section {
padding: 20px;
margin-bottom: 20px;
}

.example {
background: #fff;
padding: 20px;
border-radius: 4px;
}

h2 {
color: #333;
}

code {
background: #ddd;
padding: 2px 6px;
border-radius: 4px;
display: inline-block;
margin: 0 5px;
}
</style>
</head>

<body>
<header>
<h1>转发服务使用指南</h1>
</header>
<div class="container">
<section>
<h2>简介</h2>
<p>本服务是一个轻量级的https请求转发代理,可以帮助您绕过某些网络限制,或者在开发过程中模拟https请求。该转发接口基于Cloudflare构建,以提供快速且安全的服务体验。</p>
</section>
<section>
<h2>服务域名</h2>
<p>我们提供了多个转发服务域名,您可以根据需要选择合适的服务域名:</p>
<ul>
<li><strong>通用转发服务:</strong><code>https://lius.me</code></li>
<li><strong>Gravatar 转发服务:</strong><code>https://gravatar.lius.me</code></li>
<li><strong>GitHub 转发服务:</strong><code>https://github.lius.me</code></li>
</ul>
</section>
<section>
<h2>如何使用</h2>
<p>使用转发服务非常简单,只需遵循以下步骤:</p>
<ol>
<li>确定您想要访问的目标URL。</li>
<li>根据您的需求选择相应的转发服务域名。</li>
<li>在浏览器地址栏输入我们的转发服务URL,并在其后附加目标URL的完整路径。</li>
<li>按下回车键,我们的服务将自动将请求转发到目标URL。</li>
</ol>
</section>
<section>
<h2>特定域名转发接口</h2>
<p>我们为一些常用的服务提供了专门的转发接口,以优化访问速度和体验。</p>
<section class="example">
<h3>Gravatar 转发</h3>
<p>如果您需要访问Gravatar的头像服务,可以使用以下转发接口:</p>
<p><strong>转发服务域名:</strong><code>https://gravatar.lius.me</code></p>
<p><strong>示例:</strong>要获取用户<code>someuser</code>的Gravatar头像,访问以下URL:</p>
<p><code>https://gravatar.lius.me/avatar/someuser?s=128</code></p>
</section>
<section class="example">
<h3>GitHub 转发</h3>
<p>如果您需要访问GitHub的API或资源,可以使用以下转发接口:</p>
<p><strong>转发服务域名:</strong><code>https://github.lius.me</code></p>
<p><strong>示例:</strong>要访问用户<code>someuser</code>的GitHub仓库<code>repo</code>,请访问:</p>
<p><code>https://github.lius.me/users/someuser/repos/repo</code></p>
</section>
</section>
<section>
<h2>通用转发服务</h2>
<p>对于不提供专门转发接口的网站,您可以继续使用我们的通用转发服务。</p>
<section class="example">
<h3>通用转发示例</h3>
<p><strong>转发服务域名:</strong><code>https://lius.me</code></p>
<p><strong>示例:</strong>要访问<code>https://example.com/api/data</code>,请使用以下URL:</p>
<p><code>https://lius.me/https://example.com/api/data</code></p>
</section>
</section>
<section>
<h2>注意事项</h2>
<p>在使用转发服务时,请仔细阅读并遵守以下条款:</p>
<h3>遵守使用条款</h3>
<p>您必须遵守目标网站的使用条款和条件。本服务仅作为请求转发的中介,并不对目标网站的内容或服务负责。</p>
<h3>隐私和数据安全</h3>
<p>保护您的个人隐私和数据安全至关重要。请不要通过本服务发送任何敏感或个人身份信息,除非您已经确认目标网站具有足够的安全措施。</p>
<h3>版权和知识产权</h3>
<p>您应确保在使用本服务转发内容时,不侵犯任何第三方的版权或知识产权。对于因违反版权或知识产权法律而导致的任何争议或法律责任,您应自行承担。</p>
<h3>服务限制</h3>
<p>本服务有可能会限制请求的数量、频率或大小。请合理使用服务,避免对服务或目标网站造成不必要的负担。</p>
<h3>免责声明</h3>
<p>本服务提供“按原样”的转发服务,不提供任何形式的保证。我们不对通过本服务转发的内容的准确性、可靠性或质量负责,也不对因使用本服务而可能遭受的任何损失或损害承担责任。</p>
<h3>服务变更和中断</h3>
<p>我们保留随时修改、更新或中断服务的权利,无需事先通知。我们不承担因服务变更或中断而造成的任何责任。</p>
<h3>用户行为</h3>
<p>您应确保在使用服务时遵守所有适用的法律和规定,不进行任何非法活动或恶意行为,包括但不限于网络攻击、数据爬取或任何形式的网络欺诈。</p>
</section>
<section>
<h2>免责声明</h2>
<p><strong>免责声明:</strong></p>
<p>· 使用本转发服务时,您应自行承担风险。我们不保证服务的及时性、安全性、可用性或准确性。对于因使用或无法使用本服务而造成的任何直接、间接、特殊或后果性损害,我们不承担任何责任。</p>
<p>· 我们不对通过本服务转发的内容承担责任,包括但不限于版权、商标或其他知识产权问题。您应确保您有权转发目标URL的内容,并且遵守所有适用的法律和规定。</p>
<p>· 我们保留随时修改或中断服务的权利,无需事先通知。本服务不提供任何形式的保证或条件,无论是明示的还是暗示的。</p>
<p>· 该服务不收取任何费用,使用开源代码创建,如果本服务侵犯了任何您的权利以及现有条款,我们将立刻关闭该服务。</p>
</section>
</div>
</body>

</html>`,{
headers: {
'content-type': 'text/html;charset=UTF-8',
},
status: 200 // 确保状态码是200
});
};
const actualUrlStr = url.pathname.replace("/", "") + url.search + url.hash;
const actualUrl = new URL(actualUrlStr);
const modifiedRequest = new Request(actualUrl, {
headers: request.headers,
method: request.method,
body: request.body,
redirect: 'follow'
});
handleSpecialCases(modifiedRequest);
const response = await fetch(modifiedRequest);
const modifiedResponse = new Response(response.body, response);
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
}

部署完成后,访问对应的域名,你会得到以下页面:

转发主页说明

当然,由于一些普遍知晓的情况,访问workers.dev域名可能会遇到一些障碍。为了解决这个问题,我们可以轻松地将服务迁移到自己的域名上。以下是操作步骤:

修改域名

  1. 登录到我们的Cloudflare账户,找到并点击“设置”选项。

  2. 在设置菜单中,寻找并选择“触发器”功能。

  3. 在触发器页面,点击“添加自定义域”按钮。

  4. 在弹出的对话框中,输入我们希望使用的域名。

请注意,为了使自定义域名在Cloudflare上生效,需要确保该域名的名称服务器已经指向CloudFlare。这样,就可以享受到Cloudflare提供的加速和安全服务,同时使用自己的域名来访问Workers服务了。

通过这些简单的步骤,你就可以拥有一个个性化且易于访问的服务入口啦。

使用教程

(使用教程内容来自颢天)这个代码的使用方式非常简单,将自己要加速的链接跟在/后面就行了。例如:

具体内容大家可以到文章尾部的原文链接中进行查看。

专用转发

除了提供基础的通用转发功能,我们的服务还能够通过转发机制,实现镜像站点的创建。例如,我们可以利用这一功能搭建一个类似于 GitHubGravatar 的镜像站。接下来,我将以 GitHub 为例,展示如何实现这一过程。

在实现这一功能时,你需要在编辑代码代码部分进行相应的设置。修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// 你要镜像的网站.
const upstream = 'www.github.com'

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

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

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

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

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

// 文本替换.
const replace_dict = {
'$upstream': '$custom_domain',
'//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');
const user_agent = request.headers.get('user-agent');

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

if (https == true) {
url.protocol = 'https:';
} else {
url.protocol = 'http:';
}

if (await device_status(user_agent)) {
var upstream_domain = upstream;
} else {
var upstream_domain = upstream_mobile;
}

url.host = upstream_domain;
if (url.pathname == '/') {
url.pathname = upstream_path;
} else {
url.pathname = upstream_path + url.pathname;
}

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)) {
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', url.hostname);
new_request_headers.set('Referer', url.hostname);

let 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('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.includes('text/html') && content_type.includes('UTF-8')) {
original_text = await replace_response_text(original_response_clone, upstream_domain, url_hostname);
} 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()

var i, j;
for (i in replace_dict) {
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;
}

同样绑定域名后,访问域名,你就可以类似与github一样访问啦!

限制

在使用转发服务时,请留意以下几点限制:

  1. 请求数量限制:免费账户每天最多可以处理100,000个请求。请确保使用量在这个范围内,避免超出限制。

  2. 性能考量:虽然Cloudflare提供了全球的网络覆盖,但在国内使用时,加速效果可能会受到一些限制。因此,我们可能会遇到访问速度不如预期,甚至偶尔出现卡顿的情况。

  3. 性能波动:网络状况的不确定性可能导致服务体验出现波动,有时甚至可能出现性能不如直接访问原始资源的负优化现象。

  4. 自主选择:建议根据自己的实际需求和体验,自主决定是否采用转发服务。

免责声明

本代码示例仅供学习和教育目的使用。通过使用此代码,您需要同意以下条款:

  1. 学习用途:此代码应仅作为学习和了解相关技术概念的工具。

  2. 不承担责任:提供此代码的作者或组织不承担因使用此代码而可能产生的任何直接、间接、特殊或后果性损害的责任。

  3. 遵守法律:使用此代码时,您应确保遵守所有适用的地方、州、国家和国际法律及规定。

  4. 不侵犯版权:您不得使用此代码侵犯任何第三方的版权、商标或其他知识产权。

  5. 不用于非法目的:您不得将此代码用于任何非法、欺诈性或恶意活动。

  6. 免责声明:本代码“按原样”提供,不提供任何形式的保证,包括适销性、适用于特定目的的保证或不侵权的保证。

  7. 风险自负:使用此代码的风险由您自行承担。在使用过程中,您应采取适当的预防措施,以保护您的设备和数据。

  8. 免责声明的更改:我们保留随时修改此免责声明的权利,且修改后的免责声明自发布之日起生效。

参考链接

— 柳影曳曳,清酒孤灯,扬笔撒墨,心境如霜

PS: 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2mnsl5fvem68o