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

如何在ASP.NET Core中处理john.myexample.com这类子域名路由请求

没问题,要实现把john.myexample.com这类子域名请求映射到UserController的Profile动作并传入username参数,结合你现有的路由配置,你可以按下面的步骤来操作:

步骤1:配置Kestrel接受通配符子域名

首先你的服务器(比如Kestrel)得允许接收通配符子域名的请求,不然会直接拒绝*.myexample.com的访问。在Program.cs里添加Kestrel配置:

var builder = WebApplication.CreateBuilder(args);

// 配置Kestrel监听任意IP,允许通配符子域名
builder.WebHost.ConfigureKestrel(options =>
{
    options.ListenAnyIP(80);
    options.ListenAnyIP(443, o => o.UseHttps());
    // 如果你想更严格,可以指定仅接受*.myexample.com的请求
    // options.ListenAnyIP(443, o =>
    // {
    //     o.UseHttps();
    //     o.HostName = "*.myexample.com";
    // });
});

// 其他服务注册逻辑...

步骤2:方式一:自定义路由约束(推荐,和现有路由无缝整合)

这种方式直接在路由系统内处理子域名解析,不需要修改请求路径,更符合ASP.NET Core的路由设计思路。

编写子域名路由约束类

新建一个类SubdomainRouteConstraint,实现IRouteConstraint接口,用来提取子域名作为username参数:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;

public class SubdomainRouteConstraint : IRouteConstraint
{
    private readonly string _rootDomain;

    public SubdomainRouteConstraint(string rootDomain)
    {
        _rootDomain = rootDomain; // 传入你的主域名"myexample.com"
    }

    public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (httpContext?.Request.Host.Host == null)
            return false;

        var host = httpContext.Request.Host.Host;
        // 验证主机是否符合子域名格式
        if (host.EndsWith($".{_rootDomain}", StringComparison.OrdinalIgnoreCase))
        {
            // 提取子域名部分(比如从john.myexample.com得到john)
            var username = host.Substring(0, host.Length - _rootDomain.Length - 1);
            // 将username注入路由参数,供Controller动作接收
            values["username"] = username;
            return true;
        }

        return false;
    }
}

更新路由配置

修改你现有的路由配置,添加一个针对子域名的专属路由,同时保留原有的普通路径路由:

var app = builder.Build();

// 先注册静态文件、身份验证等中间件...

app.UseRouting();

app.UseAuthorization();

// 子域名路由:匹配xxx.myexample.com,映射到User/Profile
app.MapControllerRoute(
    name: "user_profile_subdomain",
    template: "{controller=User}/{action=Profile}",
    defaults: new { controller = "User", action = "Profile" },
    constraints: new { host = new SubdomainRouteConstraint("myexample.com") }
);

// 保留你原来的路由,处理普通路径请求(比如myexample.com/User/Profile/john)
app.MapControllerRoute(
    name: "user_profile",
    template: "{controller=User}/{action=Profile}/{username}"
);

app.Run();

这样当用户访问john.myexample.com时,路由约束会自动提取john作为username参数,直接映射到UserController.Profile(string username)方法。

步骤3:方式二:中间件重写请求路径

如果你觉得路由约束太繁琐,也可以用中间件直接修改请求路径,让现有路由能匹配上:

在Program.cs里,在UseRouting之前添加这个中间件:

var app = builder.Build();

// 子域名解析中间件:放在UseRouting之前
app.Use(async (context, next) =>
{
    var host = context.Request.Host.Host;
    var rootDomain = "myexample.com";

    if (host.EndsWith($".{rootDomain}", StringComparison.OrdinalIgnoreCase))
    {
        var username = host.Substring(0, host.Length - rootDomain.Length - 1);
        // 把请求路径重写为/User/Profile/{username},让现有路由匹配
        context.Request.Path = $"/User/Profile/{username}";
    }

    await next();
});

app.UseRouting();

// 后续中间件和原有路由配置不变...
app.MapControllerRoute(
    name: "user_profile",
    template: "{controller=User}/{action=Profile}/{username}"
);

app.Run();

这种方式更直接,中间件把john.myexample.com/的请求路径改成/User/Profile/john,你的原有路由就能正常处理了。

验证UserController的Profile动作

确保你的UserController正确接收username参数:

public class UserController : Controller
{
    public IActionResult Profile(string username)
    {
        // 这里替换成你获取用户资料的实际逻辑
        var userProfile = GetUserProfile(username);
        return View(userProfile);
    }

    // 模拟获取用户资料的方法
    private UserProfile GetUserProfile(string username)
    {
        return new UserProfile 
        { 
            Username = username, 
            DisplayName = $"@{username}",
            // 其他资料字段...
        };
    }
}

注意事项

  • 要确保你的DNS配置正确,将*.myexample.com解析到服务器IP,否则子域名请求无法到达你的应用。
  • 如果使用HTTPS,需要配置通配符SSL证书(比如*.myexample.com),否则浏览器会提示证书错误。
  • 如果有特殊子域名(比如admin.myexample.com),要在约束或中间件里排除这些域名,避免错误映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:55:35