diff --git a/.traefik.yml b/.traefik.yml index 72c43b4..c830629 100644 --- a/.traefik.yml +++ b/.traefik.yml @@ -16,5 +16,6 @@ testData: - proxyHeadername: X-From-Cdn proxyHeadervalue: cdn3 realIP: Cf-Connecting-Ip + overwriteXFF: true - proxyHeadername: "*" realIP: RemoteAddr \ No newline at end of file diff --git a/README.md b/README.md index 21fb877..667ff39 100644 --- a/README.md +++ b/README.md @@ -80,9 +80,11 @@ http: - proxyHeadername: X-From-Cdn proxyHeadervalue: mf-bar realIP: Client-Ip + OverwriteXFF: true - proxyHeadername: X-From-Cdn proxyHeadervalue: cf-foo realIP: Cf-Connecting-Ip + OverwriteXFF: true - proxyHeadername: "*" realIP: RemoteAddr diff --git a/get_real_ip.go b/get_real_ip.go index 6f8572e..9f8bc90 100644 --- a/get_real_ip.go +++ b/get_real_ip.go @@ -18,6 +18,7 @@ type Proxy struct { ProxyHeadername string `yaml:"proxyHeadername"` ProxyHeadervalue string `yaml:"proxyHeadervalue"` RealIP string `yaml:"realIP"` + OverwriteXFF bool `yaml:"overwriteXFF"` // override X-Forwarded-For } // Config the plugin configuration. @@ -53,8 +54,8 @@ func (g *GetRealIP) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // fmt.Println("☃️当前配置:", g.proxy, "remoteaddr", req.RemoteAddr) var realIP string for _, proxy := range g.proxy { - fmt.Printf("🐸 Current Proxy:%s\n", proxy.ProxyHeadervalue) if req.Header.Get(proxy.ProxyHeadername) == "*" || (req.Header.Get(proxy.ProxyHeadername) == proxy.ProxyHeadervalue) { + fmt.Printf("🐸 Current Proxy:%s\n", proxy.ProxyHeadervalue) // CDN来源确定 nIP := req.Header.Get(proxy.RealIP) if proxy.RealIP == "RemoteAddr" { @@ -77,7 +78,10 @@ func (g *GetRealIP) ServeHTTP(rw http.ResponseWriter, req *http.Request) { } // 获取到后直接设定 realIP if realIP != "" { - // req.Header.Set(xForwardedFor, realIP) + if proxy.OverwriteXFF { + fmt.Println("🐸 Modify XFF to:", realIP) + req.Header.Set(xForwardedFor, realIP) + } req.Header.Set(xRealIP, realIP) break }