访客IP设置中支持多个请求报头/X-Real-IP也可以从变量中读取

This commit is contained in:
刘祥超
2023-09-17 19:15:10 +08:00
parent 5bc4f5b359
commit 9f469f5b77

View File

@@ -1171,12 +1171,34 @@ func (this *HTTPRequest) requestRemoteAddr(supportVar bool) string {
this.web.RemoteAddr != nil && this.web.RemoteAddr != nil &&
this.web.RemoteAddr.IsOn && this.web.RemoteAddr.IsOn &&
!this.web.RemoteAddr.IsEmpty() { !this.web.RemoteAddr.IsEmpty() {
var remoteAddr = this.Format(this.web.RemoteAddr.Value) if this.web.RemoteAddr.HasValues() { // multiple values
if net.ParseIP(remoteAddr) != nil { for _, value := range this.web.RemoteAddr.Values() {
var remoteAddr = this.Format(value)
if len(remoteAddr) > 0 && net.ParseIP(remoteAddr) != nil {
this.remoteAddr = remoteAddr this.remoteAddr = remoteAddr
return remoteAddr return remoteAddr
} }
} }
} else { // single value
var remoteAddr = this.Format(this.web.RemoteAddr.Value)
if len(remoteAddr) > 0 && net.ParseIP(remoteAddr) != nil {
this.remoteAddr = remoteAddr
return remoteAddr
}
}
// 如果是从Header中读取则直接返回原始IP
if this.web.RemoteAddr.Type == serverconfigs.HTTPRemoteAddrTypeRequestHeader {
var remoteAddr = this.RawReq.RemoteAddr
host, _, err := net.SplitHostPort(remoteAddr)
if err == nil {
this.remoteAddr = host
return host
} else {
return remoteAddr
}
}
}
// X-Forwarded-For // X-Forwarded-For
var forwardedFor = this.RawReq.Header.Get("X-Forwarded-For") var forwardedFor = this.RawReq.Header.Get("X-Forwarded-For")
@@ -1585,10 +1607,10 @@ func (this *HTTPRequest) setForwardHeaders(header http.Header) {
this.RawReq.Header.Set("Connection", "keep-alive") this.RawReq.Header.Set("Connection", "keep-alive")
} }
remoteAddr := this.RawReq.RemoteAddr var rawRemoteAddr = this.RawReq.RemoteAddr
host, _, err := net.SplitHostPort(remoteAddr) host, _, err := net.SplitHostPort(rawRemoteAddr)
if err == nil { if err == nil {
remoteAddr = host rawRemoteAddr = host
} }
// x-real-ip // x-real-ip
@@ -1596,24 +1618,24 @@ func (this *HTTPRequest) setForwardHeaders(header http.Header) {
_, ok1 := header["X-Real-IP"] _, ok1 := header["X-Real-IP"]
_, ok2 := header["X-Real-Ip"] _, ok2 := header["X-Real-Ip"]
if !ok1 && !ok2 { if !ok1 && !ok2 {
header["X-Real-IP"] = []string{remoteAddr} header["X-Real-IP"] = []string{this.requestRemoteAddr(true)}
} }
} }
// X-Forwarded-For // X-Forwarded-For
if this.reverseProxy != nil && this.reverseProxy.ShouldAddXForwardedForHeader() { if this.reverseProxy != nil && this.reverseProxy.ShouldAddXForwardedForHeader() {
forwardedFor, ok := header["X-Forwarded-For"] forwardedFor, ok := header["X-Forwarded-For"]
if ok { if ok && len(forwardedFor) > 0 { // already exists
_, hasForwardHeader := this.RawReq.Header["X-Forwarded-For"] _, hasForwardHeader := this.RawReq.Header["X-Forwarded-For"]
if hasForwardHeader { if hasForwardHeader {
header["X-Forwarded-For"] = []string{strings.Join(forwardedFor, ", ") + ", " + remoteAddr} header["X-Forwarded-For"] = []string{strings.Join(forwardedFor, ", ") + ", " + rawRemoteAddr}
} }
} else { } else {
var clientRemoteAddr = this.requestRemoteAddr(true) var clientRemoteAddr = this.requestRemoteAddr(true)
if len(clientRemoteAddr) > 0 && clientRemoteAddr != remoteAddr { if len(clientRemoteAddr) > 0 && clientRemoteAddr != rawRemoteAddr {
header["X-Forwarded-For"] = []string{clientRemoteAddr + ", " + remoteAddr} header["X-Forwarded-For"] = []string{clientRemoteAddr + ", " + rawRemoteAddr}
} else { } else {
header["X-Forwarded-For"] = []string{remoteAddr} header["X-Forwarded-For"] = []string{rawRemoteAddr}
} }
} }
} }