在 OpenResty 中,要解析请求的 Host
字段并支持 IPv4 和 IPv6 地址,可以使用 Lua 的字符串处理和模式匹配。这里有一个更完整的示例,它能正确处理 IPv4、IPv6 地址以及默认端口。
-- 获取 Host 头部
local host = ngx.var.http_host
if not host then
ngx.say("No Host header found")
return
end
-- 使用模式匹配来获取 IP 和端口号
local ip, port = host:match("^%[([^%]]+)%]:(%d+)$") -- 支持 IPv6 格式 [ip]:port
if not ip then
ip, port = host:match("^([^:]+):(%d+)$") -- 支持 IPv4 格式 ip:port
end
if not ip then
ip, port = host:match("^([^:]+)$") -- 不带端口的情况 (ip 或域名)
end
-- 如果没有找到 port,则根据协议设置默认值
if not port then
if ngx.var.scheme == "https" then
port = "443"
else
port = "80"
end
end
ngx.say("IP or Domain: ", ip)
ngx.say("Port: ", port)
说明:
正则表达式:
^%[([^%]]+)%]:(%d+)$
:用于匹配形如[IPv6地址]:端口
的格式。^([^:]+):(%d+)$
:用于匹配形如IPv4地址:端口
的格式。^([^:]+)$
:用于匹配仅包含 IP 或域名而没有端口的情况。
默认端口:如果未提供端口,代码将根据请求的协议(HTTP 或 HTTPS)设定默认值。
输出:最终打印出解析出的 IP(或域名)和端口号。
注意事项:
- 在使用此代码时,请确保 OpenResty 环境已正确配置,并且可以正常接收 HTTP 请求。
- 如果需要进一步处理域名到 IP 的解析,可以结合 LuaSocket 库中的功能进行 DNS 查询,但这通常不在简单解析中涉及。
内容由零声教学AI助手提供,问题来源于学员提问