Frage

Ich bin ziemlich neu in asp.net, und haben mit iis wenig Erfahrung. Ich möchte jeder Benutzer meiner Anwendung haben ihre eigenen Sub-Domain bekommen, aber alle verwenden die gleichen Controller. Die Sub-Domain würde dann steuern, welche Inhalte angezeigt wird.

Beispiel:

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

Werden beide die gleichen Controller. Im Idealfall könnte ein Parameter, die Benutzername an den Controller geben, die dann den entsprechenden Inhalt anzeigen können. Ich würde es gerne flexibel genug sein, dass neue Subdomains in die Datenbank aufgenommen werden könnten, ohne Routing zu Umschreiben jedes Mal Regeln eine neue Sub-Domain hinzugefügt wird.

War es hilfreich?

Lösung

MVC ist nicht auf die Domäne gebunden ist, nur auf den Pfad (zB http: // domain / path ).

Um dies zu tun richtig benötigen Sie bitte den folgenden ...

  1. Wildcard DNS-Setup für * .Ihredomain.com zeigt auf Ihren Server.
  2. Die Website in IIS-Setup mit kein Host Header. Alle anderen Websites in diesem Fall von IIS gehostet die gleiche IP-Host-Header müssen angegeben.
  3. Ihre Anwendung müssen die überprüfen Anfrage Host-Header entweder beim Laden der Seite, Sitzungsbeginn oder ein anderes Ereignis.

Andere Tipps

Ich fand eine einfachere Antwort auf dieser Site Person. Sehr überrascht das funktioniert so gut es tut, und dass diese Lösung mehr als 4 Jahre alt.

http: //blog.maartenballiauw. sein / Post / 2009/05/20 / aspnet-mvc-domain-routing.aspx

Eine benutzerdefinierte Route Implementierung:

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 = ""
        };
    }}

Und hier ist, wie es verwendet werden kann.

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

Meist kein Problem. Ich denke!

Im Hinblick auf die Anwendung / das Routing des Routing beginnt dort, wo die Domäne so mehrere Domains auf die gleiche Anwendungszuordnung beendet ist kein Problem, das nur funktionieren wird.

In Bezug auf die IIS können Sie beliebig viele Domains Karte, wie Sie wollen (und es ist verpflichtet, eine Grenze zu sein) auf einer einzigen Seite - ich bin nicht sicher, ob Sie einen Platzhalter verwenden können -, welche Version von IIS verwenden Sie?

Wenn eine Anfrage kommt es Ereignisse, die Sie an der Domäne zu erhalten Haken können und somit einrichten Parameter Sie (Benutzer zum Beispiel) wollen, die Stamm-URL für die Anforderung aus dem Kontext verfügbar ist später auch im Zyklus - aber Sie ‚ll wollen, um ihn abzuholen früh.

Wenn Sie Platzhalter tun können, wird es ziemlich trivial -. Die Anfrage abholen, validieren die Sub-Domain gegen die Benutzer in der Datenbank (falls nicht gültig Umleitung auf die Standard-Site), stellen Sie den Benutzer und tragen auf die normalen Routing

Wenn Sie keine Platzhalter tun dann die Herausforderung ist das Hinzufügen von Host-Header auf die IIS-Anwendung (Website) on the fly aus Ihrer Anwendung als Benutzer der Datenbank hinzugefügt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top