nginx+lua 配置302 不改写白名单哈希表

7 篇文章 0 订阅
5 篇文章 0 订阅

配置说明:302 和 refresh 头部不改写主要是使用lua 中的 deny_rewrite 函数在进行判断,每一次请求都要进行一次字符串分割和逐条匹配 效率低下,对于大量域名白名单场景不适用。现在使用哈希表方式进行。
原先 使用

	for w in string.gmatch(location_deny_strs, "%S+") do
		if string.find(src_str, w) ~= nil then
			ngx.log(ngx.ERR, "location_deny_rewrite", w)
			return 1
		end
	end

1. 全局配置 http 块,定义lua 共享哈希表:

    lua_shared_dict _ipv6_whitedb_dict 50m;

2. init.lua 文件,进行初始化哈希表(在文件尾部添加即可):

    local file = io.open("/usr/local/nginx/conf/ipv6_whitedb", "r")
    if (file == nil) then
    	ngx.log(ngx.ERR, "lua open ipv6_whitedb ERROR")
    end
    
    local data = file:read("*line")
    local ipv6_whitedb_dict = ngx.shared._ipv6_whitedb_dict
    while data ~= nil do
    	for w in string.gmatch(data, "%S+") do
    		ok, err = ipv6_whitedb_dict:safe_add(w, 1)
    		if ok == nil then
    			ngx.log(ngx.ERR, "lua safe_add ipv6_whitedb_dict host error ", w, " error ", err)
    		end
    	end
    	data = file:read("*line")
    end

3. deny_rewrite 函数增加白名单查找判断逻辑(在函数末尾rewrite 0前添加,每一个域名都要进行本域名各级泛域名查找)

    	local ipv6_whitedb_dict = ngx.shared._ipv6_whitedb_dict
    	local len = #src_str
    	if (ipv6_whitedb_dict == nil) or (len <= 0) then
    		return 0
    	end
    	local v1,flag1 = ipv6_whitedb_dict:get(src_str)
    	if (v1 ~= nil) then
    		return 1
    	end
    	for i = 1,len do
    		local c = string.sub(src_str, i, i)
    		if (string.byte(c) == 46) then
    			local cross_domain = "*"..string.sub(src_str, i, len)
    			local v2,flag2 = ipv6_whitedb_dict:get(cross_domain)
    			if (v2 ~= nil) then
    				return 1
    			end
    		end
    	end
    



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值