如何在MVC2中使用子域作为路由值

时间:2010-11-18 16:22:14

标签: asp.net-mvc asp.net-mvc-2 routes asp.net-mvc-routing

第一

我确实已阅读并试图实施thisthis以及that,但我完全失败了:(

我的路线如下:

routes.MapRoute(
    "DefaultRoute",
    "{calurl}/{controller}/{action}/{id}",
    new { calurl = "none", controller = "Subscriber", action = "Index", id = UrlParameter.Optional }
);

我试图用作

"{calurl}.domain.com",
"{controller}/{action}/{id}"

因此路由值calurl将始终来自子域。

我可以拥有以下链接:

http://demo.domain.com/Subscriber/Register

截至今天我已经

http://domain.com/demo/Subscriber/Register

我尝试了什么

我尝试使用上面链接的示例创建我自己的CustomRoute(所有3个,一次一个),我最终总是搞砸一切。

并且我一直在想,只需要将RouteValue["calurl"]更改为子域即可获得更多代码。

  

什么/我该怎么做?

2 个答案:

答案 0 :(得分:1)

我不确定路由是否扩展到实际域名,因为域或子域不应对网站/应用程序的工作产生任何影响。

我建议在每个请求上构建自己的子域检测。这使路由和子域检测分开,有助于测试等。

这可能有所帮助:

public static string GetSubDomain()
        {
            string subDomain = String.Empty;

            if (HttpContext.Current.Request.Url.HostNameType == UriHostNameType.Dns)
            {
                subDomain = Regex.Replace(HttpContext.Current.Request.Url.Host, "((.*)(\\..*){2})|(.*)", "$2").Trim().ToLower();
            }

            if (subDomain == String.Empty)
            {
                subDomain = HttpContext.Current.Request.Headers["Host"].Split('.')[0];
            }

            return subDomain.Trim().ToLower();
        }

答案 1 :(得分:1)

如果您有IIS7,为什么不使用URL重写规则?

这可能比使用您的路由进行黑客攻击更好,IIS会做它最擅长的事情。

可能是这样的:

<rule name="rewriteSubdomains" stopProcessing="true">
  <match url="(.*).domain.com/(.*)" />
  <action type="Rewrite" url="domain.com/{R:1}/{R:2}" />
</rule>

这样,您的路线就会正确处理子域名,因为它会以不同的方式进入应用程序。