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

Azure上ASP.NET Core 2.0应用多域名路由配置最佳方案问询

实现Azure App Service多域名路由隔离的最佳方式

首先,咱们得先把基础的域名绑定搞定,再在ASP.NET Core里做路由和域名的匹配控制,分两步走:

第一步:绑定domainB.com到Azure App Service

先登录Azure门户,找到你的App Service,进入「自定义域名」选项卡,添加domainB.com。按照提示完成DNS验证(一般是在域名服务商那边添加TXT记录),绑定完成后别忘了给domainB配置SSL证书(在「TLS/SSL设置」里绑定对应的证书,避免HTTPS访问报错)。这一步是前提,不然domainB根本没法访问你的应用。

第二步:在ASP.NET Core 2.0里控制域名与路由的匹配

这里有两种常用方案,推荐第一种,因为更灵活且性能更好:

方案一:用自定义中间件提前拦截不符合的请求

在Startup.cs的Configure方法里,在路由中间件之前添加一段自定义逻辑,检查请求的域名和路径,不符合规则的直接返回404或者重定向。

比如,假设你希望domainB.com仅响应/specific-route这个路由,其他路径用domainB访问都返回404,代码如下:

// 在app.UseMvc()之前添加这个中间件
app.Use(async (context, next) =>
{
    var requestHost = context.Request.Host.Host;
    var requestPath = context.Request.Path.Value.ToLower();

    // 判断是否是domainB的请求,且访问的不是指定路由
    if (requestHost.Equals("domainB.com", StringComparison.OrdinalIgnoreCase) 
        && !requestPath.StartsWith("/specific-route"))
    {
        context.Response.StatusCode = StatusCodes.Status404NotFound;
        await context.Response.WriteAsync("该路径无法通过此域名访问");
        return;
    }

    // 符合规则,继续执行后续中间件(包括路由匹配)
    await next();
});

// 原来的MVC路由配置保持不变
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

这种方式的优势是拦截时机早,不符合规则的请求不会走到MVC路由逻辑里,性能更优,而且后续要调整规则(比如加更多域名或路由)也很方便。

方案二:给MVC路由添加主机约束

如果你的需求只是简单的特定路由绑定特定域名,可以直接在路由配置里加主机约束,指定某个路由仅匹配domainB.com:

app.UseMvc(routes =>
{
    // 仅当请求来自domainB.com时,才匹配这个特定路由
    routes.MapRoute(
        name: "domainB-specific",
        template: "specific-route",
        defaults: new { controller = "YourController", action = "YourAction" },
        constraints: new { host = "domainB.com" });

    // 默认路由,排除domainB.com的请求(需要自定义约束)
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}",
        constraints: new { host = new HostConstraint("!domainB.com") });
});

然后需要自定义一个HostConstraint类来支持反向匹配(排除domainB):

public class HostConstraint : IRouteConstraint
{
    private readonly string _targetHost;
    private readonly bool _isExclusion;

    public HostConstraint(string hostPattern)
    {
        if (hostPattern.StartsWith("!"))
        {
            _isExclusion = true;
            _targetHost = hostPattern.Substring(1);
        }
        else
        {
            _isExclusion = false;
            _targetHost = hostPattern;
        }
    }

    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var currentHost = httpContext.Request.Host.Host;
        var isMatch = string.Equals(currentHost, _targetHost, StringComparison.OrdinalIgnoreCase);
        return _isExclusion ? !isMatch : isMatch;
    }
}

这种方式适合规则简单的场景,但灵活性不如中间件方案。

最后注意事项

  • 测试的时候要清掉浏览器缓存,避免旧的DNS记录影响测试结果。
  • 确保domainB的SSL证书已经正确绑定,不然HTTPS访问会出现安全提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:57:51