Asp.net core 使用ASP.NET Core 1.1重写中间件强制实现规范主机名

Asp.net core 使用ASP.NET Core 1.1重写中间件强制实现规范主机名,asp.net-core,Asp.net Core,ASP.NET Core 1.1中新的URL重写中间件的文档中说,“例如,您可以通过重写任何请求来确保标准主机名”。不幸的是,这个例子的代码没有显示出来,因为这正是我想要做的 下面是一个例子 var options = new RewriteOptions() .AddRedirect("(.*)/", "$1"); 这使用正则表达式将任何具有尾部斜杠的请求重定向到不具有尾部斜杠的URL。如果“重定向到www.*”还没有,我需要的是与此等效的内容 我通过创建自定义IRule实现实现了

ASP.NET Core 1.1中新的URL重写中间件的文档中说,“例如,您可以通过重写任何请求来确保标准主机名”。不幸的是,这个例子的代码没有显示出来,因为这正是我想要做的

下面是一个例子

var options = new RewriteOptions()
     .AddRedirect("(.*)/", "$1");
这使用正则表达式将任何具有尾部斜杠的请求重定向到不具有尾部斜杠的URL。如果“重定向到www.*”还没有,我需要的是与此等效的内容

我通过创建自定义IRule实现实现了这一点:

public class RedirectToWwwRule : IRule
{
    public virtual void ApplyRule(RewriteContext context)
    {
        var host = context.HttpContext.Request.Host;

        if (host.HasValue && !host.Value.StartsWith("www")) {
            var req = context.HttpContext.Request;
            var response = context.HttpContext.Response;

            var newUrl = new StringBuilder()
                .Append("https://www.").Append(host)
                .Append(req.PathBase).Append(req.Path).Append(req.QueryString);

            context.HttpContext.Response.Redirect(newUrl.ToString(), true);
        }
    }
}

我正在硬编码“https://”,但在我的情况下这没关系。我认为必须有一种更简单的方法来做到这一点。

这将由宿主Web服务器而不是您的应用程序更好地处理(因为您的应用程序应该可以配置为在任何主机名下运行)。这是使用web.config文件中的
完成的。无法使用。通过负载平衡器后面的docker部署到Linux主机。用于通过IIS中的UrlWrite模块使用。我现在不可用。您在Linux主机上使用哪个Web服务器?负载平衡器正在终止SSL,然后转发到主机群集。每个主机都运行一个docker容器(ASP.NET Core 1.1优化容器),该容器运行我的ASP.NET Core进程(Kestrel)。如果我能完全控制负载平衡器(Nginx),我可以在那里做,但我不能(这是一个AWS ELB)。换句话说,443到ELB将转发到80上的Kestrel。这将由宿主Web服务器而不是您的应用程序更好地处理(因为您的应用程序应该可以配置为在任何主机名下运行)。这是使用web.config文件中的
完成的。无法使用。通过负载平衡器后面的docker部署到Linux主机。用于通过IIS中的UrlWrite模块使用。我现在不可用。您在Linux主机上使用哪个Web服务器?负载平衡器正在终止SSL,然后转发到主机群集。每个主机都运行一个docker容器(ASP.NET Core 1.1优化容器),该容器运行我的ASP.NET Core进程(Kestrel)。如果我能完全控制负载平衡器(Nginx),我可以在那里做,但我不能(这是一个AWS ELB)。换言之,443发往厄尔巴托,80发往红隼。