在 OpenResty 中,可以使用 Lua 结合 lua-resty-iputils
库来比较两个 IP 地址(IPv4/IPv6)是否相等。以下是实现方法:
1. 安装依赖库
确保已安装 lua-resty-iputils
(OpenResty 默认可能已包含):
opm get hamishforbes/lua-resty-iputils
2. Lua 代码实现
local iputils = require "resty.iputils"
-- 比较两个 IP 是否相等(支持 IPv4/IPv6)
local function compare_ips(ip1, ip2)
-- 解析 IP 地址
local parsed_ip1, err = iputils.parse_ip(ip1)
if not parsed_ip1 then
ngx.log(ngx.ERR, "Failed to parse IP1: ", err)
return false
end
local parsed_ip2, err = iputils.parse_ip(ip2)
if not parsed_ip2 then
ngx.log(ngx.ERR, "Failed to parse IP2: ", err)
return false
end
-- 直接比较解析后的二进制格式
return parsed_ip1 == parsed_ip2
end
-- 示例用法
local ip1 = "2001:db8::1"
local ip2 = "192.168.1.1"
if compare_ips(ip1, ip2) then
ngx.say("IPs are equal")
else
ngx.say("IPs are NOT equal")
end
3. 关键点说明
parse_ip
:将字符串形式的 IP(如"192.168.1.1"
或"2001:db8::1"
)解析为二进制格式,自动兼容 IPv4/IPv6。- 二进制比较:解析后的 IP 是二进制数据,直接对比即可,无需区分 IPv4/IPv6。
- 错误处理:无效的 IP 地址会返回错误(如
nil
+ 错误信息)。
4. IPv6特殊情况
如果需处理缩写形式的 IPv6(如 ::ffff:192.168.0.0/96
),可以显式标准化:
local normalized_ip = iputils.normalize_ip("::ffff:192.168.0.0")
-- Output: "0000:0000:0000:0000:0000:ffff:c0a8:0000"
5. Nginx配置示例
在 OpenResty 的 nginx.conf
中使用:
location /compare_ips {
content_by_lua_block {
local compare = require "your_module.compare_ips"
local result = compare("2001:db8::1", "2001:db8::01") -- true (IPv6等效)
ngx.say(tostring(result))
}
}
通过这种方法,可以高效、准确地比较任意格式的 IPv4/IPv6。
内容由零声教学AI助手提供,问题来源于学员提问