From 5354dceaf72d86dee74080376519e8495c67627b Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 20 Apr 2026 16:03:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(lua):=20=E4=BF=AE=E5=A4=8D=20remote=5Fport?= =?UTF-8?q?=20=E5=92=8C=20server=5Fport=20=E5=8F=98=E9=87=8F=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=A9=BA=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现 remote_port 从 RemoteAddr 正确解析端口 - 实现 server_port 从 LocalAddr 正确解析端口 - 使用 strings.LastIndex 兼容 IPv4/IPv6 地址格式 Co-Authored-By: Claude Opus 4.7 --- internal/lua/api_var.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/internal/lua/api_var.go b/internal/lua/api_var.go index af20790..72bf70e 100644 --- a/internal/lua/api_var.go +++ b/internal/lua/api_var.go @@ -19,6 +19,7 @@ package lua import ( "strconv" + "strings" "github.com/valyala/fasthttp" glua "github.com/yuin/gopher-lua" @@ -174,8 +175,12 @@ func (api *ngxVarAPI) getVariableLua(name string) glua.LValue { case "remote_port": addr := api.ctx.RemoteAddr() if addr != nil { - // 简化处理,实际可能需要解析端口 - return glua.LString("") + addrStr := addr.String() + // IPv6 地址格式: [ip]:port,IPv4 格式: ip:port + // 统一使用 LastIndex(":") 可正确处理两种格式 + if idx := strings.LastIndex(addrStr, ":"); idx >= 0 { + return glua.LString(addrStr[idx+1:]) + } } return glua.LString("") case "binary_remote_addr": @@ -189,6 +194,13 @@ func (api *ngxVarAPI) getVariableLua(name string) glua.LValue { } return glua.LString("") case "server_port": + addr := api.ctx.LocalAddr() + if addr != nil { + addrStr := addr.String() + if idx := strings.LastIndex(addrStr, ":"); idx >= 0 { + return glua.LString(addrStr[idx+1:]) + } + } return glua.LString("") case "server_name": return glua.LString(string(api.ctx.Host())) @@ -259,6 +271,13 @@ func (api *ngxVarAPI) getVariable(name string) string { case "remote_addr": return api.ctx.RemoteAddr().String() case "remote_port": + addr := api.ctx.RemoteAddr() + if addr != nil { + addrStr := addr.String() + if idx := strings.LastIndex(addrStr, ":"); idx >= 0 { + return addrStr[idx+1:] + } + } return "" case "binary_remote_addr": return "" @@ -269,6 +288,13 @@ func (api *ngxVarAPI) getVariable(name string) string { } return "" case "server_port": + addr := api.ctx.LocalAddr() + if addr != nil { + addrStr := addr.String() + if idx := strings.LastIndex(addrStr, ":"); idx >= 0 { + return addrStr[idx+1:] + } + } return "" case "server_name": return string(api.ctx.Host())