Ver código fonte

更新文档和接口

zjcqoo 6 anos atrás
pai
commit
ea1cf64949
5 arquivos alterados com 86 adições e 55 exclusões
  1. 2 8
      README.md
  2. 6 12
      cf-worker/index.js
  3. 70 0
      changelogs/0.1.0.md
  4. 5 26
      changelogs/README.md
  5. 3 9
      lua/http-dec-req-hdr.lua

+ 2 - 8
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)
 
 

+ 6 - 12
cf-worker/index.js

@@ -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 - 0
changelogs/0.1.0.md

@@ -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。

+ 5 - 26
changelogs/README.md

@@ -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)

+ 3 - 9
lua/http-dec-req-hdr.lua

@@ -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)