【问题标题】:Redirect Non WWW to WWW [duplicate]将非 WWW 重定向到 WWW [重复]
【发布时间】:2018-07-18 06:34:02
【问题描述】:

在 ASP.Net Core 应用程序启动时,我有:

RewriteOptions rewriteOptions = new RewriteOptions(); 

rewriteOptions.AddRedirectToHttps();

applicationBuilder.UseRewriter(rewriteOptions);

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

例如:

domain.com/contact > www.domain.com/contact

如何使用重写中间件做到这一点?

【问题讨论】:

  • www 已过时。你为什么要强迫人们这样做? :)
  • 我不是专家,但我一直在阅读一些类似这样的帖子:yes-www.org/why-use-www。我看到许多网站将非 www 重定向到 www。例如,谷歌、Invision 等。但同样,我不是专家。我正在尝试找出哪个更好。
  • 是的,我明白它背后的原因,这很公平。也许我们可以将一些不那么烦人的东西标准化,比如“网络”。

标签: asp.net-core


【解决方案1】:

您可以通过创建一个类并实现IRule 接口来创建自定义规则(见下文)。我认为必须有更好的方法来构造redirectUrl

public class CanonicalDomainRewriteRule : IRule
{
    public void ApplyRule(RewriteContext context)
    {
        HttpRequest request = context.HttpContext.Request;

        if (request.Host.Value.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
        {
            return;
        }
        else
        {
            HttpResponse response = context.HttpContext.Response;

            string redirectUrl = $"{request.Scheme}://www.{request.Host}{request.Path}{request.QueryString}";
            response.Headers[HeaderNames.Location] = redirectUrl;
            response.StatusCode = StatusCodes.Status301MovedPermanently;
            context.Result = RuleResult.EndResponse;
        }
    }
}

您可以在ConfigureServices 方法中添加如下规则:

RewriteOptions rewriteOptions = new RewriteOptions()
    .Add(new CanonicalDomainRewriteRule());

app.UseRewriter(rewriteOptions);

更多示例请参见Extensions and Options: IRule-based rule

【讨论】:

  • 也许我遗漏了一些东西,但不能用正则表达式来完成,使用类似的东西: .AddRedirect("redirect-rule/(.*)", "redirected/$1") 但当然用正确的规则?
  • 可能,但我无能为力。就个人而言,我可能会发现上述内容更易于阅读/维护/扩展。
猜你喜欢
  • 2015-08-03
  • 2018-06-06
  • 1970-01-01
  • 2020-09-05
  • 2019-03-09
  • 2021-08-03
  • 2011-11-05
  • 2011-12-01
相关资源
最近更新 更多