【窍门】测试环境前端静态资源注入

背景

测试环境已有静态资源服务器,但是需要设置hosts172.19.80.14 s.thsi.cn进行访问,这必须连接抓包才能完成,一些支付相关的业务由于第三方支付服务的限制,在设置抓包的情况下将无法走完流程。为了满足这样的场景,需要提供一种公网访问测试环境静态资源的方法。

测试环境nginx设置了CD静态资源的转发,链路为https://testm.10jqka.com.cn/cd/https://s.thsi.cn/cd/,这类资源只需替换域名即可。

但是采用这样的方式,必须让前端在编译测试环境页面时就将CD静态资源目录设置为 testm 域名,构建产物和线上将会不一致,十分不优雅。

所以,有什么样的方法可以即可以维持测试环境构建产物和线上一致,又能使得CD静态资源请求转到测试环境呢?

同样地,前端注入 eruda 工具,是否也能有不改变构建产物而实现的优雅方式呢?

解决方案

在 testm 的 nginx 层面处理,前端只管按照正式环境的方式进行构建,nginx层将页面所有的//s.thsi.cn/cd/替换为//testm.10jqka.com.cn/cd/,然后在 html 的 header 结束之前注入 eruda 的 script 标签即可;

使用方法

直接在 nginx.conf 中新增如下语句进行配置引用即可

include thsi_inject.conf;

按照上述配置之后,前端页面将看到 eruda 工具,并且CD资源请求全部替换为testm域名,html请求的响应头也会有Thsi-Inject-Status: true ;

如果某个前端页面不希望有 eruda 工具注入,则在转发规则中新增如下语句即可关闭

set $eruda "false";

副作用

使用注入之后,nginx返回给浏览器的相应中响应头中将不会有Content-Length,而是走Transfer-Encoding: chunked的模式,目前还没有发现由此导致的问题;

HTTP请求经由 lua 做了一层过滤,性能会有所影响;

原理

使用 openresty 的header_filterbody_filter功能即可实现,源码如下

header_filter

-- 文件位置:/data/waf/lua/inject/thsi_header.lua

local pos = string.find(ngx.var.request_uri, ".html")

if pos ~= nil then

    -- 清空响应头中的内容长度,因为body的内容替换会导致实际发送内容长度变化

    -- 标称长度和实际长度若不一致会导致前端下载html页面资源时间过长

    ngx.header.content_length = nil

    -- 响应头中添加注入的标记

    ngx.header["Thsi-Inject-Status"] = "true"

end

body_filter

-- 文件位置:/data/waf/lua/inject/thsi_body.lua

-- body_filter_by_lua, body filter模块,ngx.arg[1]代表输入的chunk,ngx.arg[2]代表当前chunk是否为last

local pos = string.find(ngx.var.request_uri, ".html")

if pos ~= nil then

    local chunk, eof = ngx.arg[1], ngx.arg[2]

    local buffered = ngx.ctx.buffered

    if not buffered then

      buffered = {}  -- XXX we can use table.new here

      ngx.ctx.buffered = buffered

    end

    if chunk ~= "" then

      buffered[#buffered + 1] = chunk

      ngx.arg[1] = nil

    end

    if eof then

      local whole = table.concat(buffered)

      ngx.ctx.buffered = nil

      -- try to unzip

      -- local status, debody = pcall(com.decode, whole)

      -- if status then whole = debody end

      -- try to add or replace response body

      -- local js_code = ...

      -- whole = whole .. js_code

      -- cd路径的静态资源请求域名替换

      whole = string.gsub(whole, "//s.thsi.cn/cd/",  "//testm.10jqka.com.cn/cd/")

      -- 注入前端调试工具

      if ngx.var.eruda ~= 'false' then

          whole = string.gsub(whole, "</head>",  '<script type="text/javascript" src="//s.thsi.cn/js/m/eruda.js"></script></head>')

      end

      ngx.arg[1] = whole

    end

end

nginx conf

# 文件位置:/usr/local/nginx/conf/thsi_inject.conf

header_filter_by_lua_file /data/waf/lua/inject/thsi_header.lua;

body_filter_by_lua_file /data/waf/lua/inject/thsi_body.lua;

参考资料

Lua + OpenResty修改response body (https://jkzhao.github.io/2018/05/03/Lua-OpenResty%E4%BF%AE%E6%94%B9response-body/)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容