原创Lua脚本压缩HTML网页源码,节省60%流量和带宽,找老板加薪

传统网站因为要注重SEO和速度,一般采用 php/java + 模板的方式开发(不会采用SPA单页模式), 特别是经过多次改版调整后,网页源码中很多无关的备注内容,占用了不少的带宽。

但是经过本Lua代码自动处理后,把空格,单行、多行备注,在输出到客户端前通通清理掉,不影响源码的备注,因此该技术还是有一定的场景。

经我测试,压缩后了只有压缩前的60%。

lua 复制代码
    local outarr = {};
    function strCompress(htm)
       if htm==nil then return end
       local pt={
         {[[\/\*(.|\r|\n)*?\*\/]],"","i", "CSS/JS多行:/*多行注释*/"},
         {[[<![-]{2}(.|\r|\n)*?[-]{2}>]],'',"i", "HTML注释:<!--注释-->"},
         {[[[\n\r\t]+]]," ","i","多个换行缩进换成1个空格"},
         {[[\s*(<[\/]*(ul|li|div)>)]],"$1","i","去ul,li,div前后空格"},
         {[[((style|alt|title|class)=[\"\']\s*[\"\'])]],"","i","去空alt  class"},
         {[[\s{2,}]],' ',"i","连续2个空格换成1个"},
         {[[(^\s*\/\/.*$)]],'',"im","前空格的双斜杠整行注释"},
    	 {[[(?<![\n\'\"\:])(\/\/[^\"\'\n]*)(?=[\n])]],'',"im","代码后双斜杠注释"},
         {[[^\s{1,}]],'',"im","去行开始的空格"},
         {[[(\}|\{|\(|,|:|;)(\s|\n)*]],'$1',"is","大括号,左括号,逗号,分号后面的空白"},
         {[[(\s|\n)*(\}.*$)]],'$2',"im","跨行右大括号 左边的空白"},
         {[[\)\s*\{]],'){',"im","同行 右括号_左大括号中间空白"},
          {[[\}if]],'};if',"im","fix 行末不加分号后面接if"}
        }
        -- 选择规则顺序有讲究的,否则兼容性下降
        local Pats = {pt[1],pt[2],pt[3],pt[4],pt[5],pt[6]};
        local from, to, substr = ngx.re.find(htm, "script","oj");
        if from==2 then 
          Pats= {pt[1],pt[7],pt[8],pt[9],pt[10],pt[11],pt[12],pt[13]}  
        end 
       
        for i, v in pairs(Pats) do
          local newstr = ngx.re.gsub(htm, v[1], v[2], v[3]);
          if newstr then  htm = newstr end
        end
        return htm
     end
       
     function split_script(a)
          local i = 0
          return
          function( str, max)
            if leave == nil and i==0 then leave=str end
            if leave == nil then return nil  end
            local from,to,err = ngx.re.find(leave, "<script.*?/script>", "sjo")
              i=i+1
              if from then 
                local delimiter = strCompress(string.sub(leave,from, to))
                local cutstr = strCompress(string.sub(leave, 0, from-1))
                if #cutstr>0 and cutstr~=' ' then 
                 table.insert(outarr, cutstr)
                end
                table.insert(outarr, delimiter) 
                leave = string.sub(leave,to+1)
                if max>128 or #leave==0 then return nil end
                return i,leave
              else
                table.insert(outarr, strCompress(leave))
                return nil
              end 
          end ,a,0
     end  

	function doTraverse(str)
		-- 遍历处理
		for k,v in split_script( str ) do
	        -- ngx.say(":-->>"..k.."<<--:", v )
		end 
	end
    -- 仅仅压缩html内容
	local i,j = ngx.re.find( ngx.header["Content-Type"], "text/html","sjo");
	if  i ~= nil then
	  
	    local chunk, eof = ngx.arg[1], ngx.arg[2] -- 获取当前的流 和是否时结束
	    local info = ngx.ctx.buf
	    chunk = chunk or ""
	    
	    if info then
	        ngx.ctx.buf = info .. chunk -- 这个可以将原本的内容记录下来
	    else
	        ngx.ctx.buf = chunk
	    end
	    
	    if eof then
	        -- ngx.ctx.buffered = nili
	        if status == 413 or status == "413" then  -- 413是Nginx request body timeout 的状态吗
			   ngx.arg[1] = "<h1>Nginx request body timeout</h1>"
	        else
			   doTraverse( ngx.ctx.buf ) 
		       ngx.arg[1] = table.concat(outarr,"")
	        end
	    else
	      	  ngx.arg[1] = ""
	    end
	end

使用方式

把以上内容存储到 proxy-data-minify.lua文件中,在宝塔站点配置 Nginx 站点配置文件中加入:

conf 复制代码
body_filter_by_lua_file /www/server/lua/proxy-data-minify.lua;

或者统一在 /www/server/nginx/conf/phpinfo.conf 末尾加入上面一行,这样会处理所有php 输出到 网页源码。

相关推荐
诙_17 小时前
由C++速通Lua
开发语言·lua
yeshan4 天前
【Draft】基于 cluacov 的 Lua 代码分支覆盖率统计:从行级近似到指令级精确
单元测试·lua
zz0723204 天前
Redis + Lua 实现高性能分布式限流
redis·lua·aop·限流算法·分布式限流
衣舞晨风4 天前
运行时行为盲区:API7 AI 网关CPU打满故障的AI辅助事后复盘
lua·openresty·apisix·coroutine·cpu-saturation·socket-buffer
笨鸟先飞的橘猫7 天前
基于Skynet的分布式游戏场景题:大型MMO的跨服战场系统设计
分布式·学习·游戏·面试·lua
Huanzhi_Lin9 天前
skynet笔记
笔记·lua·skynet·actor·actor模型
笨鸟先飞的橘猫9 天前
MMO游戏中的“跨服团队副本”匹配与状态同步系统
分布式·学习·游戏·lua·skynet
Kiyra10 天前
限流不是加个计数器就行:用 Lua 脚本实现多维度原子限流
开发语言·人工智能·网络协议·职场和发展·架构·lua·ai-native
谙弆悕博士11 天前
Lua学习笔记
c语言·开发语言·笔记·学习·lua·创业创新·业界资讯
weixin_4080996711 天前
触动精灵调用身份证OCR识别API实现智能信息录入(Lua脚本实战)
junit·ocr·lua·自动化脚本·石榴智能·身份证ocr识别·触动精灵