使用Asp.Net核心中间件将非WWW重定向到WWW

Mig*_*ura 14 regex url-rewriting asp.net-core asp.net-core-middleware

在ASP.Net核心应用程序启动我有:

RewriteOptions rewriteOptions = new RewriteOptions(); 

rewriteOptions.AddRedirectToHttps();

applicationBuilder.UseRewriter(rewriteOptions);
Run Code Online (Sandbox Code Playgroud)

在生产中我需要将所有非WWW重定向到WWW Urls

例如:

domain.com/about > www.domain.com/about
Run Code Online (Sandbox Code Playgroud)

我怎么能用Rewrite Middleware做到这一点?

我认为这可以使用AddRedirect和Regex完成:

Github - ASP.NET核心重定向文档

但不知道怎么做......

小智 13

可重用的替代方法是创建自定义重写规则和相应的扩展方法,以将规则添加到重写选项.这与AddRedirectToHttps的工作方式非常相似.

自定义规则:

public class RedirectToWwwRule : IRule
{
    public virtual void ApplyRule(RewriteContext context)
    {
        var req = context.HttpContext.Request;
        if (req.Host.Host.Equals("localhost", StringComparison.OrdinalIgnoreCase))
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        if (req.Host.Value.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        var wwwHost = new HostString($"www.{req.Host.Value}");
        var newUrl = UriHelper.BuildAbsolute(req.Scheme, wwwHost, req.PathBase, req.Path, req.QueryString);
        var response = context.HttpContext.Response;
        response.StatusCode = 301;
        response.Headers[HeaderNames.Location] = newUrl;
        context.Result = RuleResult.EndResponse;
    }
}
Run Code Online (Sandbox Code Playgroud)

扩展方法:

public static class RewriteOptionsExtensions
{
    public static RewriteOptions AddRedirectToWww(this RewriteOptions options)
    {
        options.Rules.Add(new RedirectToWwwRule());
        return options;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var options = new RewriteOptions();
options.AddRedirectToWww();
options.AddRedirectToHttps();
app.UseRewriter(options);
Run Code Online (Sandbox Code Playgroud)

重写中间件的未来版本将包含规则和相应的扩展方法.请参阅此拉取请求


Sup*_*uck 11

自 ASP.NET Core 3.0 (2019) 起,可以使用以下方法:

  • AddRedirectToWwwPermanent()
  • 添加重定向到WWW()

例子

app.UseRewriter(new RewriteOptions()
  .AddRedirectToWww());
Run Code Online (Sandbox Code Playgroud)

请参阅https://learn.microsoft.com/en-us/aspnet/core/fundamentals/url-rewriting?view=aspnetcore-5.0


rev*_*evo 5

我更像是一个 Apache 用户,幸运的是 ASP.NET Core 中的 URL 重写中间件提供了一种称为动态AddApacheModRewrite执行规则的方法。mod_rewrite

1- 创建一个.txt文件(无论名称如何)并将这两行放入其中:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

2-然后这样称呼它:

AddApacheModRewrite(env.ContentRootFileProvider, "Rules.txt")
Run Code Online (Sandbox Code Playgroud)

完毕!


pro*_*tor 0

您不需要正则表达式,只需简单替换即可:

var temp = new string[] {"http://google.com", "http://www.google.com", "http://gmail.com", "https://www.gmail.com", "https://example.com"};

var urlWithoutWWW = temp.Where(d => 
                         d.IndexOf("http://www") == -1 && d.IndexOf("https://www") == -1);

foreach (var newurl in urlWithoutWWW)
{
     Console.WriteLine(newurl.Replace("://", "://www."));
}
Run Code Online (Sandbox Code Playgroud)