Files
new-pai-linghe/middleware/domain_group_router.go
吴中洋 d481e1ae62 feat(log): 计费详情记录域名来源(domain_host), 仅管理员可见
- 域名路由命中时把来源域名存入 ctx, 经 GenerateTextOtherInfo 写进 other.admin_info
- 角色控制纯后端: admin_info 在用户日志接口被 formatUserLogs 自动剥离, 普通用户看不到
- 前端 details-dialog 在管理员区展示「域名来源」一行
2026-06-03 04:48:46 +08:00

45 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package middleware
import (
"github.com/QuantumNous/new-api/common"
"github.com/QuantumNous/new-api/constant"
"github.com/QuantumNous/new-api/logger"
"github.com/QuantumNous/new-api/setting"
"github.com/gin-gonic/gin"
)
// DomainAutoGroupRouter 按请求来源域名把顶层 "auto" 路由到对应的二级 auto高价池 / 低价池)。
//
// - 仅当当前生效分组(UsingGroup)为 "auto" 时介入;其他分组的 key 全程不受影响。
// - 域名优先取 X-Forwarded-Host生产由 nginx 各域名入口注入),回退 Host去端口、小写。
// - 命中 DomainAutoRouting 且目标二级 auto 存在时,同时改写 UsingGroup 与 TokenGroup
// UsingGroup 影响首次选渠道(distributor)TokenGroup 影响重试循环(relayInfo.TokenGroup 快照)。
// - 未命中或目标非法时保持 "auto",回退到顶层 AutoGroups。
//
// 必须挂在 TokenAuth 之后、Distribute 之前。
func DomainAutoGroupRouter() gin.HandlerFunc {
return func(c *gin.Context) {
if common.GetContextKeyString(c, constant.ContextKeyUsingGroup) != "auto" {
c.Next()
return
}
host := c.GetHeader("X-Forwarded-Host")
if host == "" {
host = c.Request.Host
}
domain := setting.NormalizeDomain(host)
if target, ok := setting.ResolveDomainToSecondaryAuto(domain); ok {
if _, valid := setting.GetSecondaryAutoGroup(target); valid {
common.SetContextKey(c, constant.ContextKeyUsingGroup, target)
common.SetContextKey(c, constant.ContextKeyTokenGroup, target)
common.SetContextKey(c, constant.ContextKeyDomainHost, domain)
logger.LogDebug(c, "domain routing: %s -> secondary auto group %s", domain, target)
}
}
c.Next()
}
}