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完成:
但不知道怎么做......
小智 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) 起,可以使用以下方法:
例子
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
我更像是一个 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)
完毕!
您不需要正则表达式,只需简单替换即可:
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)