在 ASP.Net Core 应用程序启动时,我有:
RewriteOptions rewriteOptions = new RewriteOptions();
rewriteOptions.AddRedirectToHttps();
applicationBuilder.UseRewriter(rewriteOptions);
在生产中,我需要将所有非 WWW 重定向到 WWW Urls
例如:
domain.com/about > www.domain.com/about
如何使用重写中间件来做到这一点?
我认为这可以使用 AddRedirect 和 Regex 来完成:
Github - ASP.NET Core Redirect Docs
但不知道该怎么做...
最佳答案
可重用的替代方法是创建自定义重写规则和相应的扩展方法,以将规则添加到重写选项。这与 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;
}
}
扩展方法:
public static class RewriteOptionsExtensions
{
public static RewriteOptions AddRedirectToWww(this RewriteOptions options)
{
options.Rules.Add(new RedirectToWwwRule());
return options;
}
}
用法:
var options = new RewriteOptions();
options.AddRedirectToWww();
options.AddRedirectToHttps();
app.UseRewriter(options);
重写中间件的 future 版本将包含规则和相应的扩展方法。见 this pull request
关于regex - 使用 Asp.Net Core 中间件将非 WWW 重定向到 WWW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43823413/