使用CloudFlare Worker 免费部署 JSProxy 服务
[使用CloudFlare Worker 免费部署 JSProxy 服务 - 云+社区 - 腾讯云](https://cloud.tencent.com/developer/article/1606070 )]
本教程仅仅用于学习交流使用
Cloudflare Workers
官方介绍:
在边缘运行代码,提供强大的 Web 可扩展性
在边缘应用自定义安全规则和过滤逻辑来检测恶意 Bots 病毒并防止它们消耗资源,从而提高安全性。
将更多个性化和交互性纳入静态 HTML 页面,并在边缘运行动态请求,从而改善用户体验。
将更多操作流程和请求处理转移到边缘,以提高缓存命中率并降低带宽成本,从而降低运营成本。
简单的说就是你不用服务器就可以运行你的代码.
不必担心服务器成本,僵尸流量攻击或部署服务器资源与架构,您可以直接编写代码,开发程序服务。
可以使用的工具:
- 运行任何JavaScript代码,使用最新的标准语言特性;
- 拦截并修改HTTP请求,响应URL、状态、头信息和正文;
- 直接从Worker响应请求,或者转发到其他地方;
- 把HTTP请求发送给第三方服务器;
- 串行或并行发送多个请求,把这些请求的响应组合成原始请求的最终响应;
- 在响应返回给客户端以后发送异步请求(例如,记录日志或分析);
- 控制其他Cloudflare特性,比如缓存行为。
- 等...
免费版支持每天10 万次免费请求,日常使用基本够了。
使用教程
没有 Cloudflare 账号的提前注册一个
打开 https://workers.cloudflare.com ,登录上你的 Cloudflare 账号激活 Workers 服务
然后点击 Create a Worker 创建一个,具体说明看图

在 script 左侧代码区,编写完毕后,点击Save and Deploy 保存并部署下,就可以查看你的服务了。

域名格式:https://自定义的名称.Cloudflare用户名.workers.dev
jsproxy
jsproxy 是一个基于浏览器端 JS 实现的在线代理
部署代理
我们需要配合上面创建的 Cloudflare Workers 实现代理
我们需要将 jsproxy
的代码复制到 你创建的 Cloudflare Workers
的 script
里,然后保存部署。
代码地址:https://github.com/EtherDream/jsproxy/blob/master/cf-worker/index.js (文章下面有代码备份)
预览下:

自定义域名
如果使用自定义域名,需要配置一个域名CNAME解析绑定:xxx.workers.dev
,并开启CDN,即点亮黄云图标
最后:浏览网站的时候,有时候会提示加载不安全脚本,点击允许即可!另外jsproxy
也可以使用github pages
实现在线代理,这里不多介绍。
代码备份
'use strict'
/**
* static files (404.html, sw.js, conf.js)
*/
const ASSET_URL = 'https://etherdream.github.io/jsproxy'
const JS_VER = 10
const MAX_RETRY = 1
/** @type {RequestInit} */
const PREFLIGHT_INIT = {
status: 204,
headers: new Headers({
'access-control-allow-origin': '*',
'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
'access-control-max-age': '1728000',
}),
}
/**
* @param {any} body
* @param {number} status
* @param {Object<string, string>} headers
*/
function makeRes(body, status = 200, headers = {}) {
headers['--ver'] = JS_VER
headers['access-control-allow-origin'] = '*'
return new Response(body, {status, headers})
}
/**
* @param {string} urlStr
*/
function newUrl(urlStr) {
try {
return new URL(urlStr)
} catch (err) {
return null
}
}
addEventListener('fetch', e => {
const ret = fetchHandler(e)
.catch(err => makeRes('cfworker error:\n' + err.stack, 502))
e.respondWith(ret)
})
/**
* @param {FetchEvent} e
*/
async function fetchHandler(e) {
const req = e.request
const urlStr = req.url
const urlObj = new URL(urlStr)
const path = urlObj.href.substr(urlObj.origin.length)
if (urlObj.protocol === 'http:') {
urlObj.protocol = 'https:'
return makeRes('', 301, {
'strict-transport-security': 'max-age=99999999; includeSubDomains; preload',
'location': urlObj.href,
})
}
if (path.startsWith('/http/')) {
return httpHandler(req, path.substr(6))
}
switch (path) {
case '/http':
return makeRes('请更新 cfworker 到最新版本!')
case '/ws':
return makeRes('not support', 400)
case '/works':
return makeRes('it works')
default:
// static files
return