You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 7区域映射子域名异常:主站被定向到Sugar区域

ASP.NET Core 子域名映射Area的正确实现方式

问题根源

  1. 路由转换器逻辑错误:原SubDomainRouteTransformer未正确识别子域名并设置area路由值,反而错误修改controller参数,且判断逻辑完全颠倒(仅空值时才赋值,不符合需求)。
  2. 路由注册顺序与参数错误:动态路由配置参数有误,且注册顺序导致主站请求被错误匹配到Area路由。

正确实现步骤

1. 修正SubDomainRouteTransformer

修改转换器逻辑,仅当子域名匹配目标Area名称(如sugar)时设置area路由值;否则保持原有路由值,交由默认路由处理主站请求:

public class SubDomainRouteTransformer : DynamicRouteValueTransformer
{
    private readonly string _targetArea = "sugar";

    public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        var hostParts = httpContext.Request.Host.Host.Split('.');
        // 处理根域名(如localhost、example.com)场景,避免误匹配
        if (hostParts.Length <= 1)
        {
            return values;
        }

        var subDomain = hostParts[0];
        // 子域名匹配目标Area时,注入area路由值
        if (string.Equals(subDomain, _targetArea, StringComparison.OrdinalIgnoreCase))
        {
            values["area"] = _targetArea;
            // 可选:设置Area默认的控制器/动作
            // values.TryAdd("controller", "Home");
            // values.TryAdd("action", "Index");
        }

        return values;
    }
}

2. 修正Program.cs中的路由配置

  • 动态路由优先于默认路由注册(路由匹配按顺序执行,更具体的规则需前置)
  • 动态路由模式无需指定{area:exists},转换器会自动注入area值:
builder.Services.TryAddTransient<SubDomainRouteTransformer>();

// 先注册动态路由,处理子域名到Area的映射
app.MapDynamicControllerRoute<SubDomainRouteTransformer>(
    name: "SubDomainArea",
    pattern: "{controller=Home}/{action=Index}/{id?}");

// 再注册默认路由,处理主站请求
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

// 可选:注册Area专属路由约定,确保Area控制器能被正常识别
app.MapAreaControllerRoute(
    name: "sugar_area",
    areaName: "sugar",
    pattern: "{controller=Home}/{action=Index}/{id?}");

3. 验证Area控制器配置

确保sugarArea的控制器带有[Area("sugar")]特性:

[Area("sugar")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

关键说明

  • 子域名判断需考虑根域名场景,避免将localhost或顶级域名的主机名误当作子域名处理。
  • 路由注册顺序直接影响匹配逻辑,动态路由必须前置,否则主站请求会优先被默认路由拦截。
  • 额外注册MapAreaControllerRoute可保障Area内部路由的独立性,即使不通过子域名访问也能正常匹配。

内容的提问来源于stack exchange,提问作者alvinchesaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:37:21