From ef03d71375837b0b30157b2697ff86494883295a Mon Sep 17 00:00:00 2001 From: wood chen Date: Mon, 2 Jun 2025 08:10:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=84=E5=88=99=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=85=88=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=89=A9=E5=B1=95=E5=90=8D=E8=A7=84=E5=88=99=EF=BC=8C?= =?UTF-8?q?=E7=AE=80=E5=8C=96302=E8=B7=B3=E8=BD=AC=E5=A4=84=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E7=A1=AE=E4=BF=9D=E5=9C=A8=E6=97=A0=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=97=B6=E4=B8=8D=E5=BC=BA=E5=88=B6=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=89=A9=E5=B1=95=E5=90=8D=E8=A7=84=E5=88=99=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB=E6=80=A7?= =?UTF-8?q?=E5=92=8C=E9=80=BB=E8=BE=91=E6=B8=85=E6=99=B0=E5=BA=A6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/service/rule_service.go | 61 +++++++++----------------------- 1 file changed, 16 insertions(+), 45 deletions(-) diff --git a/internal/service/rule_service.go b/internal/service/rule_service.go index 41f1398..003aa75 100644 --- a/internal/service/rule_service.go +++ b/internal/service/rule_service.go @@ -107,34 +107,9 @@ func (rs *RuleService) SelectRuleForRedirect(client *http.Client, pathConfig con return result } - // 如果默认目标配置了302跳转,优先使用 - if pathConfig.RedirectMode { - result.Found = true - result.ShouldRedirect = true - result.TargetURL = pathConfig.DefaultTarget - return result - } - - // 检查扩展名规则 + // 优先检查扩展名规则,即使根级别配置了302跳转 if len(pathConfig.ExtRules) > 0 { - ext := extractExtension(path) - - var matcher *utils.ExtensionMatcher - - // 尝试使用缓存管理器 - if rs.cacheManager != nil { - pathKey := fmt.Sprintf("redirect_%p", &pathConfig) - matcher = rs.cacheManager.GetExtensionMatcher(pathKey, pathConfig.ExtRules) - } else { - matcher = utils.NewExtensionMatcher(pathConfig.ExtRules) - } - - // 快速检查:如果没有任何302跳转规则,跳过复杂逻辑 - if !matcher.HasRedirectRule() { - return result - } - - // 尝试选择最佳规则 + // 尝试选择最佳规则(包括文件大小检测) if rule, found, usedAlt := rs.SelectBestRule(client, pathConfig, path); found && rule != nil && rule.RedirectMode { result.Rule = rule result.Found = found @@ -144,25 +119,21 @@ func (rs *RuleService) SelectRuleForRedirect(client *http.Client, pathConfig con return result } - // 回退到简单的扩展名匹配 - if rule, found := pathConfig.GetProcessedExtRule(ext); found && rule.RedirectMode { - result.Rule = rule - result.Found = found - result.UsedAltTarget = true - result.ShouldRedirect = true - result.TargetURL = rule.Target - return result - } + // 注意:这里不再进行"忽略大小"的回退匹配 + // 如果SelectBestRule没有找到合适的规则,说明: + // 1. 扩展名不匹配,或者 + // 2. 扩展名匹配但文件大小不在配置范围内,或者 + // 3. 无法获取文件大小,或者 + // 4. 目标服务器不可访问 + // 在这些情况下,我们不应该强制使用扩展名规则 + } - // 检查通配符规则 - if rule, found := pathConfig.GetProcessedExtRule("*"); found && rule.RedirectMode { - result.Rule = rule - result.Found = found - result.UsedAltTarget = true - result.ShouldRedirect = true - result.TargetURL = rule.Target - return result - } + // 如果没有匹配的扩展名规则,且默认目标配置了302跳转,使用默认目标 + if pathConfig.RedirectMode { + result.Found = true + result.ShouldRedirect = true + result.TargetURL = pathConfig.DefaultTarget + return result } return result