首页
关于
留言
Search
1
红米 AX3000 (AX6) 路由器解锁 SSH 教程
6,676 阅读
2
网盘挂载程序sharelist美化教程
4,216 阅读
3
小米路由器 AX3600 开启SSH教程,官方固件即可安装 ShellClash开启科学上网
2,168 阅读
4
Oracle 甲骨文 ARM VPS 自动抢购脚本
1,819 阅读
5
编译带PassWall和SSR-plus插件的Openwrt系统
1,393 阅读
前端
Vue
React
后端
Java
Python
PHP
数据库
运维
杂谈
小程序
影视资源
登录
Search
标签搜索
Java
Linux
Mysql
IDEA
Debian
Docker
Springboot
CentOS
Cloudflare
Maven
JavaScript
SQL
Wordpress
宝塔
Nginx
Windows
MacBook
JS
CSS
Openwrt
William
累计撰写
144
篇文章
累计收到
702
条评论
首页
栏目
前端
Vue
React
后端
Java
Python
PHP
数据库
运维
杂谈
小程序
影视资源
页面
关于
留言
搜索到
2
篇与
的结果
2021-07-07
使用Cloudflare Workers反代网站
Workers 的工作原理就是最近几年火热的 serverless。网站管理员不再一定需要一个服务器,只需要将对应的 Function 托管在 Workers 上,当用户访问网站时就会执行对应的 Function,值得一提的是 Cloudflare Workers 本质上只支持 JS反代代码// 需要反代的地址 const upstream = 'www.example.com' // 反代地址的子路径 const upstreamPath = '/' // 反代网站的移动端域名 const upstreamMobile = 'www.example.com' // 是否使用 https const useHttps = true // 禁止使用该 worker 的国家代码 const blockedRegion = ['KP', 'SY', 'PK', 'CU'] // 禁止使用该 worker 的 ip 地址 const blockedIp = ['0.0.0.0', '127.0.0.1'] // 是否关闭缓存 const disableCache = false // 替换条件 const contentTypes = [ 'text/plain', 'text/html' ] // 反代网站中其他需要被替换的地址 const replaceDict = { '$upstream': '$workerDomain', } addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) /** * Respond to the request * @param {Request} request */ async function handleRequest(request) { const region = request.headers.get('cf-ipcountry') || ''; const ip = request.headers.get('cf-connecting-ip'); if (blockedRegion.includes(region.toUpperCase())) { return new Response('Access denied: WorkersProxy is not available in your region yet.', { status: 403 }); } if (blockedIp.includes(ip)) { return new Response('Access denied: Your IP address is blocked by WorkersProxy.', { status: 403 }); } const upstreamDomain = isMobile(request.headers.get('user-agent')) ? upstreamMobile : upstream; // 构建上游请求地址 let url = new URL(request.url); const workerDomain = url.host; url.protocol = useHttps ? 'https:' : 'http'; url.pathname = url.pathname === '/' ? upstreamPath : upstreamPath + url.pathname; url.host = upstreamDomain; // 构建上游请求头 const newRequestHeaders = new Headers(request.headers); newRequestHeaders.set('Host', upstreamDomain); newRequestHeaders.set('Referer', url.protocol + '//' + workerDomain); // 获取上游响应 const originalResponse = await fetch(url.href, { method: request.method, headers: newRequestHeaders }) const connectionUpgrade = newRequestHeaders.get("Upgrade"); if (connectionUpgrade && connectionUpgrade.toLowerCase() === "websocket") { return originalResponse; } let originalResponseClone = originalResponse.clone(); // 构建响应头 let responseHeaders = originalResponseClone.headers; let newResponseHeaders = buildResponseHeaders(responseHeaders); if (newResponseHeaders.get("x-pjax-url")) { newResponseHeaders.set("x-pjax-url", responseHeaders.get("x-pjax-url").replace("//" + upstreamDomain, "//" + workerDomain)); } // 构建响应体 let originalText; const contentType = newResponseHeaders.get('content-type'); if (contentType != null) { const types = contentType.replace(' ','').split(';') if (types.includes('charset=utf-8')){ for (let i of contentTypes) { if (types.includes(i)){ originalText = await replaceResponseText(originalResponseClone, upstreamDomain, workerDomain); break } } } } else { originalText = originalResponseClone.body } return new Response(originalText, { status: originalResponseClone.status, headers: newResponseHeaders }) } function isMobile(userAgent) { userAgent = userAgent || '' let agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; for (let v = 0; v < agents.length; v++) { if (userAgent.indexOf(agents[v]) > 0) { return true; } } } function buildResponseHeaders(originalHeaders) { const result = new Headers(originalHeaders); if (disableCache) { result.set('Cache-Control', 'no-store'); } result.set('access-control-allow-origin', '*'); result.set('access-control-allow-credentials', true); result.delete('content-security-policy'); result.delete('content-security-policy-report-only'); result.delete('clear-site-data'); return result } async function replaceResponseText(response, upstreamDomain, workerDomain) { let text = await response.text() const placeholders = { "$upstream": upstreamDomain, "$workerDomain": workerDomain } for (let origin in replaceDict) { let target = replaceDict[origin] origin = placeholders[origin] || origin target = placeholders[target] || target const re = new RegExp(origin, 'g') text = text.replace(re, target); } return text; }
2021年07月07日
136 阅读
0 评论
0 点赞
2021-02-23
使用Cloudflare Worker 搭建 Hexo 个人博客教程
Cloudflare Worker 是 Cloudflare 提供的基于 Serverless 的云端服务,最新的 Workers Sites 允许使用者将博客程序如 Hexo、Wordpress 等部署到 Cloudflare 云端运行,算是新开发出来的奇技淫巧吧。本教程以 Hexo 部署为例,默认具有 Node 环境。安装 Cloudflare 提供的部署程序 Wrangler安装 WranglerWrangler 的项目地址:github.com/cloudflare/wrangler按照官方教程,使用 npm 安装 Wrangler ,在控制台输入$ npm i @cloudflare/wrangler -g #全局安装 $ # npm i @cloudflare/wrangler #如果默认环境无法进行全局安装,可以使用此局部安装命令,在工程目录需使用npx调用cargo 方式安装 Wrangler(未使用)$ cargo install wrangler获取 Cloudflare api 密钥在 Cloudflare 的 api 控制台 中创建一个新的 api-token,点击新建 api-token,选择使用模板(Start with a template)。使用 Edit Cloudflare Workers 模板创建新的 api,配置相应的权限即可获得一个新的 api-tokens,保存备用。配置 Wrangler 全局密钥控制台执行$ wrangler config输入刚才保存的 api-tokens 运行验证即可完成全部配置。初始化 Wrangler在工程目录终端中执行$ wrangler init --site my-static-site #my-static-site替换为要创建的Works名称# $ npx wrangler init --site my-static-site #局部安装使用此命令,用法如上执行此条命令会在工程目录中生成 wrangler.toml 和 aworkers-site, 其中 wrangler.toml 是工程中 Wrangler 的配置文件。配置 Wrangler简单设置 Wrangler.toml默认生成的 wrangler.toml 如下,可依据设置name = "site" #此处为之前初始化填写的Workes名称 type = "webpack" account_id = "" #这里填写自己的Workers ID,在Workers面板中查找 workers_dev = true route = "" #这里是个性化域名区域 zone_id = "" [site] bucket = "public" #这里填写Hexo程序默认的生成目录文件 entry-point = "workers-site"配置个性化域名这一步可以不填写,使用默认的 Workers 域名根据以下提示写入 wrangler.tomlzone_id = "42ef.."route = "example.com/*"设置自定义域名时,可以在 wrangler 配置完成后,在域名管理中的 Workers 设置中添加对应的 Workers 路由,再将 SSL 安全级别调整为 Flexible,否则会遇到 SSL 526 错误。上传全站到 Cloudflare Workers使用 Hexo 生成一次静态文件首先使用 Hexo 在工程目录生成一次静态文件,以产生 public 文件,如不生产则会下下一步上传中报错。上传 Public 到 Cloudflare控制台中运行$ wrangler publish提示以下即完成所有的运行操作。Using namespace for Workers Site "__site-workers_sites_assets" Uploading site files Success⬇️ Installing wranglerjs...⬇️ Installing wasm-pack... Built successfully, built project size is 11 KiB. Successfully published your script to https://*.workers.dev #这里就是生成的预览地址部署在 Workers 的 Hexo 演示程序:https://test.pv.workers.dev/ ,演示程序所生成的静态文件存储在对应的 Workers KV 中。注意事项注意,免费版本的 Workers Plan 有每天 100,000 次的访问限制(100,000 requests per day ),免费额度适合小站部署(流量大容易翻车),大站还是使用独立服务器或者收费版本部署稳一些。
2021年02月23日
156 阅读
0 评论
1 点赞