Skip to content

Commit

Permalink
更新文档和接口
Browse files Browse the repository at this point in the history
  • Loading branch information
EtherDream committed Jul 24, 2019
1 parent 6b69387 commit ea1cf64
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 55 deletions.
10 changes: 2 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@

# 更新

* 2019-07-24 后端接口调整,和之前版本不兼容,请及时更新。[详细](changelogs/0.1.0.md)

* 2019-06-22 [cfworker 无服务器版](cf-worker) 发布,长期使用演示服务的请使用该版本。

* 2019-06-11 前端脚本调整,首页可离线访问(如果长时间加载中,尝试多刷新几次或者隐身模式访问)

* 2019-05-30 更新 cfworker,对 ytb 视频进行了优化(推荐选 1080p+,不会增加服务器压力)

* 2019-05-29 nginx 增加静态资源服务,可同时支持代理接口和首页访问

* 2019-05-27 增加 nio.io、sslip.io 后备域名,减少申请失败的几率

* 2019-05-26 安装时自动申请证书(使用 xip.io 域名),安装后即可预览

[查看更多](changelogs)


Expand Down
18 changes: 6 additions & 12 deletions cf-worker/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ function httpHandler(req, pathname) {
return new Response(null, PREFLIGHT_INIT)
}

let urlStr = ''
let acehOld = false
let rawSvr = ''
let rawLen = ''
Expand All @@ -108,9 +107,6 @@ function httpHandler(req, pathname) {
if (k.substr(0, 2) === '--') {
// 系统信息
switch (k.substr(2)) {
case 'url':
urlStr = v
break
case 'aceh':
acehOld = true
break
Expand All @@ -131,20 +127,18 @@ function httpHandler(req, pathname) {
reqHdrNew.delete('referer')
}

if (!urlStr) {
urlStr = pathname.substr('/http/'.length)
}
let targetUrlStr = pathname.substr('/http/'.length)

// cfworker 会把路径中的 `//` 合并成 `/`
const m = urlStr.match(/^https?:(\/+)/)
const m = targetUrlStr.match(/^https?:(\/+)/)
if (m && m[1] !== '//') {
urlStr = urlStr.replace('/', '//')
targetUrlStr = targetUrlStr.replace('/', '//')
}

try {
var urlObj = new URL(urlStr)
var targetUrlObj = new URL(targetUrlStr)
} catch (err) {
return makeRes('invalid url: ' + urlStr, 403)
return makeRes('invalid url: ' + targetUrlStr, 403)
}

/** @type {RequestInit} */
Expand All @@ -156,7 +150,7 @@ function httpHandler(req, pathname) {
if (req.method === 'POST') {
reqInit.body = req.body
}
return proxy(urlObj, reqInit, acehOld, rawLen, 0)
return proxy(targetUrlObj, reqInit, acehOld, rawLen, 0)
}


Expand Down
70 changes: 70 additions & 0 deletions changelogs/0.1.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# v0.1.0

## 主要更新

* 后端代理接口调整,修复缓存失效的问题

* 前端增加缓存记录,提高浏览器缓存命中率

* 前端增加 Cookie 持久化

* 前端增加 CORS 站点直连功能

* 配置调整,支持线路权重

* 更详细的服务器错误信息显示

* 增加更多的 Storage API Hook


## 代理接口调整

之前代理接口使用固定的路径 `/http`,目标 URL 设置在请求头 `--url` 字段,同时返回头配置了 `vary: --url` 字段,希望能根据不同的 `--url` 请求返回不同的缓存内容。但事实上该方案并未生效,和预想的不同,浪费了不少流量。(对 `vary` 了解不够透彻~

为修复这个问题,目前将代理接口改成 `/http/目标 URL`,去掉了 `vary` 字段。同时将绝大部分的请求字段打包到 `Referer` 字段里,使请求头保持简单,不产生 CORS preflight。

> 如果不打包,则会频繁出现 preflight,即使配置了 `Access-Control-Max-Age` 也没用,因为 max-age 只对特定 URL 记忆,而现在的 URL 几乎每次都不同,所以必须保持请求头足够简单。至于为什么选择 `Referer` 字段,因为只有这个字段可以灵活存储数据,[其他几个字段都有些限制](https://fetch.spec.whatwg.org/#cors-unsafe-request-header-byte),容易出现 preflight。
当然这个功能目前仍在研究中,未来也许会有更好的方案。


## 节点缓存

由于切换 节点/线路 会使得最终的 URL 发生变化,从而导致无法利用已有的缓存。

目前增加了静态资源记忆功能,记住当前使用的域名。下次加载时直接使用上次的域名,从而命中浏览器缓存。

存储查看:`indexedDB` -> `.sys` -> `url-cache`


## Cookie 持久化

目前 Cookie 信息定期同步到本地存储,浏览器重启后可保持之前的会话。

存储查看:`indexedDB` -> `.sys` -> `cookie`


## CORS 站点直连

不少网站(通常是 CDN)在返回头中配置了 `access-control-allow-origin: *`,并且不校验 `origin``referer`(或者允许为空)。

对于这样的站点,前端可直接连接而无需通过代理,从而能加快访问速度,并且节省代理服务器流量。

目前收集了部分站点,只在纯前端实现。未来将尝试和服务端配合,覆盖所有这样的场合。


## 节点权重支持

不同于之前均匀分配负载,目前可配置每个线路的权重,从而对部分线路增加或降低负载。

例如演示案例中的 cfworker 节点,使用 1 个收费版 + 多个免费版的方案。由于免费版有访问频率限制,因此使用更低的权重以减少负载。(命中比例 = 当前值 / 总值)


## 详细错误信息

目前可显示代理服务器的 DNS 解析错误、HTTP 连接错误、白名单错误等,取代之前过于简陋的报错信息。


## Storage API Hook

增加 `indexedDB``Cache Storage` 的 key 枚举、删除的 API Hook。
31 changes: 5 additions & 26 deletions changelogs/README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,11 @@
# 完整更新日志

## v0.0.1
* 2019-05-30 更新 cfworker,对 ytb 视频进行了优化(推荐选 1080p+,不会增加服务器压力)

全选的 URL 模型,取代 [之前版本](https://github.com/EtherDream/jsproxy/tree/first-ver)[查看详细](v0.0.1.md)
* 2019-05-29 nginx 增加静态资源服务,可同时支持代理接口和首页访问

* 2019-05-27 增加 nio.io、sslip.io 后备域名,减少申请失败的几率

## 开发中...
* 2019-05-26 安装时自动申请证书(使用 xip.io 域名),安装后即可预览

最新临时的测试,没分版本号

### 节点切换功能(服务端)

服务端对于体积较大的资源不返回内容,只返回长度、修改时间、首块 hash 等信息。浏览器从廉价带宽获取完整内容,如果返回信息不一致,再从原服务器获取。

目前体积阈值为 400KB。廉价带宽使用 Cloudflare Worker,源码参考 `cf-worker` 目录。虽然 Cloudflare Worker 延时较高,但带宽和流量无限制,且费用较低(1000 万次请求 5 美元),非常适合大文件代理。


### 静态资源加速(前端)

通过自动化工具分析 TOP 10 网站的资源,将缓存时间久的静态资源,预先下载到 CDN 上(包括一个 URL Hash 列表)。前端遇到这些资源时直接从 CDN 获取,大幅减少下载时间,以及代理服务器的带宽占用和流量消耗。

目前 CDN 暂使用 jsdelivr。未来尝试将资源上传到贴吧等支持 CORS 的免费图床~

另外演示首页的静态资源也使用 CDN。


### 安装工具更新

增加一键安装脚本,Linux x64 系统可自动安装。

(没仔细测。有问题 issure 反馈。以后有时间补充测试案例。。。)
* 全新的 URL 模型,取代 [之前版本](https://github.com/EtherDream/jsproxy/tree/first-ver)[查看详细](v0.0.1.md)
12 changes: 3 additions & 9 deletions lua/http-dec-req-hdr.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
-- 还原 HTTP 请求头
local hasRawUrl = false
local hasRawRefer = false

local hdrs = ngx.req.get_headers()
Expand All @@ -12,10 +11,7 @@ for k, v in pairs(param) do
if k:sub(1, 2) == '--' then
k = k:sub(3)

if k == 'url' then
ngx.var._url = v
hasRawUrl = true
elseif k == 'ver' then
if k == 'ver' then
ngx.var._ver = v
elseif k == 'type' then
ngx.var._type = v
Expand All @@ -41,7 +37,5 @@ if not hasRawRefer then
ngx.req.clear_header('referer')
end

if not hasRawUrl then
-- 删除 URL 的 '/http/' 前缀
ngx.var._url = ngx.var.request_uri:sub(7)
end
-- 删除 URL 的 '/http/' 前缀
ngx.var._url = ngx.var.request_uri:sub(7)

0 comments on commit ea1cf64

Please sign in to comment.