在 OpenResty 中,您可以使用 Nginx 提供的变量来解析 HTTP 请求的 Host
字段,并从中获取 IP 地址和端口号。通常,Host
字段会包含主机名或 IP 地址及其对应的端口号。
以下是一个示例代码片段,演示如何在 OpenResty 中解析请求的 Host
字段,并提取出 IP 地址和端口号(支持 IPv4 和 IPv6):
location /get-host {
content_by_lua_block {
-- 获取 Host 字段
local host = ngx.var.http_host
-- 检查是否包含冒号 (:) 来区分 IP 和端口
local ip, port = host:match("^(.*):(%d+)$")
if not ip then
-- 如果没有指定端口,则将port设置为 nil 或者默认值
ip = host
port = ngx.var.server_port -- 使用当前服务器的端口作为默认值
end
-- 输出结果
ngx.say("Request Host: ", host)
ngx.say("IP Address: ", ip)
ngx.say("Port: ", port)
}
}
说明:
- ngx.var.http_host:获取请求中的
Host
字段。 - string.match():通过正则表达式来匹配
host
的格式。如果存在冒号,则将其分为 IP 和端口;否则,IP 设置为host
,并使用当前请求的服务器端口。 - 输出请求的完整主机、提取到的 IP 地址和端口号。
注意事项:
- 当客户端请求时,如果在 URL 中指定了非标准端口(例如,在浏览器中输入
http://[::1]:8080/
),这时也能够正确识别并输出。 - 如果客户端仅提供了主机名或 IP 而没有附加端口信息,可以用
ngx.var.server_port
来获得实际处理请求所使用的服务器端口。
通过这种方式,您可以有效地解析 HTTP 请求中的主机字段,并提取必要的信息。如果有其他问题或需要进一步帮助,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问