문제

나는 ASP.NET을 처음 접했으며 IIS에 대한 경험이 거의 없습니다. 내 응용 프로그램의 각 사용자가 자신의 하위 도메인을 얻도록하고 싶지만 모두 동일한 컨트롤러를 사용합니다. 그런 다음 하위 도메인은 어떤 컨텐츠가 표시되는지 제어합니다.

예시:

user1subdomain.mydomain.com/Whatever
user2subdomain.mydomain.com/Whatever

둘 다 동일한 컨트롤러를 사용합니다. 이상적으로 매개 변수는 사용자 이름을 컨트롤러에 제공 한 다음 적절한 컨텐츠를 표시 할 수 있습니다. 새 하위 도메인이 추가 될 때마다 라우팅 규칙을 다시 작성하지 않고도 새로운 하위 도메인을 데이터베이스에 추가 할 수있을 정도로 유연하기를 원합니다.

도움이 되었습니까?

해결책

MVC http : // domain/path).

이 작업을 제대로하려면 다음이 필요합니다 ...

  1. *.yourdomain.com에 대한 와일드 카드 DNS 설정 서버를 가리키십시오.
  2. 호스트 헤더가없는 IIS 설정 사이트. 동일한 IP의 IIS 인스턴스에서 호스팅 된 다른 사이트에는 호스트 헤더가 지정되어 있어야합니다.
  3. 응용 프로그램은 페이지로드, 세션 시작 또는 다른 이벤트에서 요청 호스트 헤더를 확인해야합니다.

다른 팁

이 사람의 블로그에서 더 쉬운 답변을 찾았습니다. 이 솔루션은 4 년이 넘었습니다.

http://blog.maartenballiauw.be/post/2009/05/20/aspnet-mvc-domain-routing.aspx

사용자 정의 경로 구현 :

public class DomainRoute : Route
{
    public string Domain { get; set; }


    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        // Build regex
        domainRegex = CreateRegex(Domain);
        pathRegex = CreateRegex(Url);

        // Request information
        string requestDomain = httpContext.Request.Headers["host"];
        if (!string.IsNullOrEmpty(requestDomain))
        {
            if (requestDomain.IndexOf(":") > 0)
            {
                requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
            }
        }
        else
        {
            requestDomain = httpContext.Request.Url.Host;
        }
        string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;

        // Match domain and route
        Match domainMatch = domainRegex.Match(requestDomain);
        Match pathMatch = pathRegex.Match(requestPath);

        // Route data
        RouteData data = null;
        if (domainMatch.Success && pathMatch.Success)
        {
            data = new RouteData(this, RouteHandler);

            // Add defaults first
            if (Defaults != null)
            {
                foreach (KeyValuePair<string, object> item in Defaults)
                {
                    data.Values[item.Key] = item.Value;
                }
            }

            // Iterate matching domain groups
            for (int i = 1; i < domainMatch.Groups.Count; i++)
            {
                Group group = domainMatch.Groups[i];
                if (group.Success)
                {
                    string key = domainRegex.GroupNameFromNumber(i);
                    if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                    {
                        if (!string.IsNullOrEmpty(group.Value))
                        {
                            data.Values[key] = group.Value;
                        }
                    }
                }
            }

            // Iterate matching path groups
            for (int i = 1; i < pathMatch.Groups.Count; i++)
            {
                Group group = pathMatch.Groups[i];
                if (group.Success)
                {
                    string key = pathRegex.GroupNameFromNumber(i);
                    if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0))
                    {
                        if (!string.IsNullOrEmpty(group.Value))
                        {
                            data.Values[key] = group.Value;
                        }
                    }
                }
            }
        }    
    return data;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return base.GetVirtualPath(requestContext, RemoveDomainTokens(values));
    }

    public DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)
    {
        // Build hostname
        string hostname = Domain;
        foreach (KeyValuePair<string, object> pair in values)
        {
            hostname = hostname.Replace("{" + pair.Key + "}", pair.Value.ToString());
        }

        // Return domain data
        return new DomainData
        {
            Protocol = "http",
            HostName = hostname,
            Fragment = ""
        };
    }}

그리고 여기에 사용할 수있는 방법이 있습니다.

routes.Add("DomainRoute", new DomainRoute(
"{controller}-{action}.example.com",     // Domain with parameters
"{id}",    // URL with parameters
new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
));

대부분 문제가 아닙니다. 제 생각에는!

응용 프로그램/라우팅 측면에서 라우팅은 도메인이 종료되는 곳에서 시작하여 여러 도메인을 동일한 응용 프로그램에 매핑하는 것은 문제가되지 않으므로 작동합니다.

IIS 측면에서 원하는만큼의 도메인을 단일 사이트에 매핑 할 수 있습니다. 와일드 카드를 사용할 수 있는지 확실하지 않습니다. 어떤 버전의 II를 사용하고 있습니까?

요청이 도착하면 이벤트가 있으면 도메인을 살펴보고 원하는 매개 변수 (예 : 사용자)를 설정할 수 있습니다. 일찍 선택합니다.

와일드 카드를 수행 할 수있는 경우 상당히 사소한 것이됩니다. 요청을 선택하고 데이터베이스의 사용자에 대한 하위 도메인을 기본 사이트로 유효한 리디렉션이 아닌 경우 사용자를 설정하고 일반 라우팅을 수행하십시오.

와일드 카드를 수행 할 수없는 경우 사용자가 데이터베이스에 추가되면 응용 프로그램에서 즉시 IIS 응용 프로그램 (웹 사이트)에 호스트 헤더를 추가하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top