I tried the last solution and did not work for ASP.NET Core 1.1
Microsoft has a nuget package named Rewrite, A middleware where you can rewrite or redirect some requests, but also there is a way to write a custom Rule, where you can capture the subdomain and add it to the request path:
public class RewriteSubdomainRule : IRule
{
public void ApplyRule(RewriteContext context)
{
var request = context.HttpContext.Request;
var host = request.Host.Host;
// Check if the host is subdomain.domain.com or subdomain.localhost for debugging
if (Regex.IsMatch(host, @"^[A-Za-zd]+.(?:[A-Za-zd]+.[A-Za-zd]+|localhost)$"))
{
string subdomain = host.Split('.')[0];
//modifying the request path to let the routing catch the subdomain
context.HttpContext.Request.Path = "/subdomain/" + subdomain + context.HttpContext.Request.Path;
context.Result = RuleResult.ContinueRules;
return;
}
context.Result = RuleResult.ContinueRules;
return;
}
}
On Startup.cs
You have to add the middleware to use the custom rewrite rule:
app.UseRewriter(new RewriteOptions().Add(new RewriteSubdomainRule()));
And after this lines I define a route that receives the subdomain added on the request path and assign it to the subdomain variable:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "subdomain",
template: "subdomain/{subdomain}/{controller=Home}/{action=Index}/{id?}");
});
On the controller you can use it like this
public async Task<IActionResult> Index(int? id, string subdomain)
{
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…