跨多个子域的URL路由

时间:2010-07-14 02:42:09

标签: c# asp.net asp.net-mvc url-routing

我发现自己处境艰难。我们正在开发一个ASP.NET MVC 2应用程序,它由多个部分组成。将这些部分跨越多个子域是一个设计目标。每个子域都有自己的控制器。

挑战在于我们的托管服务提供商的控制面板允许两种形式的子域重定向,而且它们似乎都不符合要求。选择是:

  • 重定向到网址。选择是否重定向到相对于请求URL的确切目的地或目的地。

  • 重定向到我的托管空间中的特定文件夹。

我会尝试说明预期的行为。假设默认路由为{controller}/{action}/{id},我希望URL http://subdomain.welcome.com/a/b由MVC应用程序处理,如http://welcome.com/subdomain/a/b

URL重定向可以解决此问题,除了用户在浏览器中看到URL更改的事实。我们不希望客户端看到重定向发生。

重定向到我们的MVC应用程序根文件夹根本不起作用。该应用程序不会接收请求,IIS会传回4xx错误。

编辑:

为了找到答案,我会简化一下。 “重定向到URL”没有按照我想要的方式执行,因此不会重定向到文件夹。

如果我将子域重定向到我的MVC应用程序的根文件夹而IIS不会接收请求,这是IIS或我的提供商的限制吗?

2 个答案:

答案 0 :(得分:6)

您可以让托管网站的主机标题回复*.mydomain.com吗?这意味着,您的网站是否可以接收主域名的任何子域名请求?如果是这样,那么请参考this post如何处理MVC应用程序中的子域路由,你应该好好去。

我会将帖子中的代码更新为此,以使代码更简洁。在任何情况下,请确保您尝试转到不存在的子域时遇到404错误。

public class ExampleRoute : RouteBase
{

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var url = httpContext.Request.Headers["HOST"];
        var index = url.IndexOf(".");

        if (index < 0)
            return null;

        var subDomain = url.Substring(0, index);

            var routeData = new RouteData(this, new MvcRouteHandler());
            routeData.Values.Add("controller", subdomain); //attempts to go to controller action of the subdomain
            routeData.Values.Add("action", "Index"); //Goes to the Index action on the User2Controller

            return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        //Implement your formating Url formating here
        return null;
    }
}

答案 1 :(得分:0)

不确定这是否过度(这实际上是用于从zip文件或资源文件中提供页面等),但是......也许你可以使用虚拟路径提供程序?..

实现一个继承自VirtualPathProvider的类,并在全局启动中注册它,如下所示:

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());

然后实现一个继承自VirtualFile的类,并从虚拟路径提供程序实现中的GetFile()覆盖中提供它:

public override VirtualFile GetFile( string virtualPath )
{
 if( IsVirtualFile(virtualPath) )
    return new MyVirtualFile(virtualPath);
 return base.GetFile(virtualPath);
}

注意: 根据您对网址格式的规定等,IsVirtualFile是您必须实施的功能。 < / p>