配置说明: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