修复CDN环境下获取真实客户端IP的问题

This commit is contained in:
2026-06-24 11:18:56 +08:00
parent fe69a2e38b
commit 1fc933e014
3 changed files with 19 additions and 2 deletions
+1 -1
View File
@@ -183,7 +183,7 @@ func PostComment(db *gorm.DB) gin.HandlerFunc {
Content: sanitizeMarkdown(form.Content),
IsPrivate: form.IsPrivate,
Status: models.CommentApproved,
IPAddress: truncate(c.ClientIP(), 64),
IPAddress: truncate(GetClientIP(c), 64),
UserAgent: truncate(c.GetHeader("User-Agent"), 512),
}
+17
View File
@@ -1,6 +1,8 @@
package handlers
import (
"strings"
"github.com/gin-gonic/gin"
)
@@ -64,3 +66,18 @@ func getTr(c *gin.Context) map[string]string {
}
return m
}
// GetClientIP extracts the real client IP address, accounting for CDN/reverse proxy setups.
// It checks X-Forwarded-For and X-Real-IP headers before falling back to c.ClientIP().
func GetClientIP(c *gin.Context) string {
if xff := c.GetHeader("X-Forwarded-For"); xff != "" {
if i := strings.IndexByte(xff, ','); i != -1 {
return strings.TrimSpace(xff[:i])
}
return strings.TrimSpace(xff)
}
if xri := c.GetHeader("X-Real-IP"); xri != "" {
return strings.TrimSpace(xri)
}
return c.ClientIP()
}
+1 -1
View File
@@ -306,7 +306,7 @@ func recordArticleView(db *gorm.DB, articleID uint, c *gin.Context) {
}
// Get client IP and User-Agent
ip := c.ClientIP()
ip := GetClientIP(c)
userAgent := c.Request.UserAgent()
isBot := models.IsBot(userAgent)