mirror of
https://github.com/EtherDream/jsproxy
synced 2024-11-22 01:49:01 +00:00
更新文档和接口
This commit is contained in:
parent
6b69387e41
commit
ea1cf64949
10
README.md
10
README.md
@ -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)
|
||||
|
||||
|
||||
|
@ -89,7 +89,6 @@ function httpHandler(req, pathname) {
|
||||
return new Response(null, PREFLIGHT_INIT)
|
||||
}
|
||||
|
||||
let urlStr = ''
|
||||
let acehOld = false
|
||||
let rawSvr = ''
|
||||
let rawLen = ''
|
||||
@ -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
|
||||
@ -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} */
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
70
changelogs/0.1.0.md
Normal file
70
changelogs/0.1.0.md
Normal file
@ -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。
|
@ -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)
|
||||
|
@ -1,5 +1,4 @@
|
||||
-- 还原 HTTP 请求头
|
||||
local hasRawUrl = false
|
||||
local hasRawRefer = false
|
||||
|
||||
local hdrs = ngx.req.get_headers()
|
||||
@ -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
|
||||
@ -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)
|
Loading…
Reference in New Issue
Block a user