From 8f3c304837d5fbb2e4d8a51a48501586eb6b8d79 Mon Sep 17 00:00:00 2001 From: xfy Date: Sat, 9 May 2026 13:41:26 +0800 Subject: [PATCH] fix(lua): register Lua routes in multi-server mode Add registerLuaRoutes method for router-based route registration and call it in startMultiServerMode to fix Lua routes not working when multiple servers are configured. Co-Authored-By: Claude Opus 4.7 --- internal/server/router.go | 59 +++++++++++++++++++++++++++++++++++++++ internal/server/server.go | 3 ++ 2 files changed, 62 insertions(+) diff --git a/internal/server/router.go b/internal/server/router.go index af5d007..238ba11 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -253,6 +253,65 @@ func (s *Server) registerStaticHandlers(router *handler.Router, cfg *config.Serv } } +// registerLuaRoutes 使用 Router 注册 Lua 路由。 +// +// 遍历 Lua 配置中的脚本,为带有 Route 配置的脚本创建 LuaRouteHandler +// 并注册到 Router。 +// +// 参数: +// - router: 路由器实例 +// - serverCfg: 服务器配置 +// +// 注意事项: +// - 只有设置了 Route 字段的脚本才会被注册 +// - 支持 exact、prefix、regex 匹配类型(router 模式下统一使用路径匹配) +func (s *Server) registerLuaRoutes(router *handler.Router, serverCfg *config.ServerConfig) { + if s.luaEngine == nil || serverCfg.Lua == nil || !serverCfg.Lua.Enabled { + return + } + + for _, script := range serverCfg.Lua.Scripts { + if script.Route == "" { + continue + } + + timeout := script.Timeout + if timeout == 0 { + timeout = 30 * time.Second + } + luaHandler := lua.NewLuaRouteHandler(s.luaEngine, script.Path, timeout) + handler := s.wrapRoutedHandler(luaHandler.ServeHTTP) + + // Router 模式下,根据 routeType 注册不同路由 + routePath := script.Route + routeType := script.RouteType + if routeType == "" { + routeType = "prefix" + } + + switch routeType { + case "exact": + // 精确匹配:只注册该路径 + router.GET(routePath, handler) + router.POST(routePath, handler) + router.PUT(routePath, handler) + router.DELETE(routePath, handler) + router.HEAD(routePath, handler) + default: + // 前缀匹配:注册带通配符的路径 + if !strings.HasSuffix(routePath, "/") && routePath != "/" { + routePath += "/" + } + wildcardPath := routePath + "{path:*}" + router.GET(wildcardPath, handler) + router.POST(wildcardPath, handler) + router.PUT(wildcardPath, handler) + router.DELETE(wildcardPath, handler) + router.HEAD(wildcardPath, handler) + } + } +} + // registerLuaRoutesWithLocationEngine 使用 LocationEngine 注册 Lua 路由。 // // 遍历 Lua 配置中的脚本,为带有 Route 配置的脚本创建 LuaRouteHandler diff --git a/internal/server/server.go b/internal/server/server.go index d297455..7d5e98c 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -680,6 +680,9 @@ func (s *Server) startMultiServerMode() error { s.registerProxyRoutes(router, serverCfg) + // Lua 路由 + s.registerLuaRoutes(router, serverCfg) + // 静态文件服务 s.registerStaticHandlers(router, serverCfg)