将子文件夹重写为MVC中的子域

时间:2019-06-25 09:59:44

标签: asp.net-mvc-4 routes

我有一个现有的实现,可以为每个用户提供一个网址,例如

https://example.com/FirstUser
https://example.com/SecondUser 

https://example.com之后,他希望客户拥有哪个URL取决于客户 到目前为止,我们已经通过MVC路由及其正常工作进行了处理。

这需要更改为https://FirstUser.example.com

有人可以帮我什么最好的方法吗,我浏览了一些博客,看来我必须添加重定向来重定向URL 从https://example.com/FirstUserhttps://FirstUser.example.com

<rule name="redirect" stopProcessing="true">
                    <match url="users/([_0-9a-z-]+)(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="www.example.net" />
                    </conditions>
                    <action type="Redirect" url="http://{R:1}.example.net{R:2}" />
                </rule>

https://forums.iis.net/t/1176588.aspx?Rewrite+Subfolder+to+Subdomain

在我的情况下,可能会有用户或控制器名称,因此在“ /”之后可能是userURL或控制器名称,例如https://example.com/Login

我面临的三个问题

  1. 用户输入https://example.com/User1并重定向到 https://user1.example.com
  2. 如果用户输入https://user1.example.com,并且应该转到指定的或经过硬编码的控制器
  3. 用户输入https://example.com,应该进入登录页面

第二种解决方案

public class SubdomainRoute : RouteBase
        {

            public override RouteData GetRouteData(HttpContextBase httpContext)
            {
                var host = httpContext.Request.Url.Host;
                var index = host.IndexOf(".");
                string[] segments = httpContext.Request.Url.PathAndQuery.Split('/');

                if (index < 0)
                    return null;

                var subdomain = host.Substring(0, index);
                string controller = (segments.Length > 0) ? segments[0] : "Home";
                string action = (segments.Length > 1) ? segments[1] : "Index";

                var routeData = new RouteData(this, new MvcRouteHandler());
                routeData.Values.Add("controller", controller); //Goes to the relevant Controller  class
                routeData.Values.Add("action", action); //Goes to the relevant action method on the specified Controller
                routeData.Values.Add("subdomain", subdomain); //pass subdomain as argument to action method
                return routeData;
            }          

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

我无法处理1和3rd,我该如何区分或编写规则,或者应该在代码中处理它?<​​/ p>

需要专家意见。

谢谢

0 个答案:

没有答案