From 2b2617200d88777ebc3d54e2720b5c895e06fbb8 Mon Sep 17 00:00:00 2001 From: dragon Date: Tue, 15 Apr 2025 16:43:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20gotemplate=20=E7=9A=84?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/renders/gotemplate.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/pkg/renders/gotemplate.go b/pkg/renders/gotemplate.go index c86b42e..b7dca25 100644 --- a/pkg/renders/gotemplate.go +++ b/pkg/renders/gotemplate.go @@ -3,6 +3,7 @@ package renders import ( "bytes" "io" + "net" "net/http" "strings" "text/template" @@ -32,8 +33,10 @@ func (g GoTemplate) Render(w http.ResponseWriter, r *http.Request, input io.Read } err = parse.Execute(out, map[string]interface{}{ "Request": map[string]any{ - "Method": r.Method, - "Headers": headers, + "Headers": headers, + "Request": r.RequestURI, + "RemoteAddr": r.RemoteAddr, + "RemoteIP": GetRemoteIP(r), }, }) if err != nil { @@ -42,3 +45,26 @@ func (g GoTemplate) Render(w http.ResponseWriter, r *http.Request, input io.Read _, err = out.WriteTo(w) return err } + +// 注意,相关 ip 获取未做反向代理安全判断,可能导致安全降级 + +func GetRemoteIP(r *http.Request) string { + // 最先取 cloudflare 的头 + if ip := r.Header.Get("CF-Connecting-IP"); ip != "" { + return ip + } + if forwardedFor := r.Header.Get("X-Forwarded-For"); forwardedFor != "" { + ips := strings.Split(forwardedFor, ",") + if len(ips) > 0 { + return strings.TrimSpace(ips[0]) + } + } + if realIP := r.Header.Get("X-Real-IP"); realIP != "" { + return realIP + } + ip, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + return r.RemoteAddr + } + return ip +}