- 域名路由命中时把来源域名存入 ctx, 经 GenerateTextOtherInfo 写进 other.admin_info - 角色控制纯后端: admin_info 在用户日志接口被 formatUserLogs 自动剥离, 普通用户看不到 - 前端 details-dialog 在管理员区展示「域名来源」一行
45 lines
1.7 KiB
Go
45 lines
1.7 KiB
Go
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()
|
||
}
|
||
}
|