zjcqoo 6 éve
szülő
commit
ad2bc23ea7
3 módosított fájl, 31 hozzáadás és 1 törlés
  1. 25 0
      README.md
  2. 5 0
      lua/http-enc-res-hdr.lua
  3. 1 1
      nginx.conf

+ 25 - 0
README.md

@@ -96,6 +96,31 @@ https://myhost.github.io     'my';
 参数和 nginx -s 相同。
 
 
+## 项目特点
+
+相比传统在线代理,本项目具有以下特点:
+
+### 服务端开销低
+
+传统在线代理的原理,基本都是在服务端替换 HTML/JS/CSS 等资源中的 URL。这不仅需要对内容做大量的分析和处理,还需对流量进行解压和再压缩,消耗大量的 CPU 资源。由于服务端的逻辑较为复杂,因此大多使用 Python/PHP 等自己实现。
+
+为降低服务端开销,本项目使用了浏览器的一个黑科技 —— Service Worker。它能让 JS 拦截网页产生的请求,并能自定义返回内容,相当于在浏览器内部实现一个反向代理。这使得绝大部分的内容处理都可以在浏览器上完成,服务器只需纯粹的转发流量。
+
+因此本项目服务端直接使用 nginx,并且转发过程不修改内容(只修改 HTTP 头),避免了内容处理产生的巨大开销。同时得益于 nginx 丰富的功能,很多常用需求无需重新造轮子,通过简单配置即可实现。并且无论性能还是稳定性,都远高于自己实现。
+
+### API 虚拟化
+
+传统在线代理大多只针对静态 URL 的替换,而忽视了动态加载 URL,以及和调用 URL 相关的网页 API。例如 a.com 反向代理 google.com,但页面中 JS 读取 `document.domain` 得到的仍是 a.com。这可能会导致某些业务逻辑出现问题。
+
+为缓解这个问题,本代理在页面头部注入一个 JS,用以重写绝大部分和 URL 相关的 API,使得页面中的 JS 获取到的仍是原始 URL:
+
+![](https://raw.githubusercontent.com/EtherDream/jsproxy-localtest/temp/hook.png)
+
+### 界面和接口分离
+
+参见下文
+
+
 # CHANGELOG
 
 ## v0.0.1

+ 5 - 0
lua/http-enc-res-hdr.lua

@@ -23,6 +23,8 @@ for k, v in pairs(h) do
     k == 'set-cookie'
   then
     if type(v) == 'table' then
+      -- 如果存在重名字段(例如 Set-Cookie)
+      -- 则转义成:0-Set-Cookie, 1-Set-Cookie, ...
       for i = 1, #v do
         local x = i .. '-' .. k
         ngx.header[x] = v[i]
@@ -32,6 +34,7 @@ for k, v in pairs(h) do
         end
       end
     else
+      -- 默认转义成:--Set-Cookie
       local x = '--' .. k
       ngx.header[x] = v
 
@@ -39,6 +42,7 @@ for k, v in pairs(h) do
         expose = expose .. ',' .. x
       end
     end
+    -- 删除原始字段
     ngx.header[k] = nil
 
   elseif k == 'vary' then
@@ -64,6 +68,7 @@ end
 
 if detail then
   expose = expose .. ',--s'
+  -- 该字段不在 aceh 中,如果浏览器能读取到,说明支持 aceh: *
   ngx.header['--t'] = '1'
 end
 

+ 1 - 1
nginx.conf

@@ -16,8 +16,8 @@ http {
 
   ssl_protocols           TLSv1.2 TLSv1.3;
   ssl_ciphers             TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
-  ssl_session_timeout     1d;
   ssl_session_cache       shared:SSL:30m;
+  ssl_session_timeout     1d;
   ssl_prefer_server_ciphers on;
 
   limit_req_log_level     warn;