【问题标题】:Custom URL Rewriting自定义 URL 重写
【发布时间】:2018-08-14 08:43:00
【问题描述】:

我想使用 UseRewriter 中间件重写一个简单的 url。

var rewrite = new RewriteOptions()
    .AddRedirect("Page1From", "Page1To")        // Redirect
    .AddRewrite("Page2From", "Page2To", true);  // Rewrite

app.UseRewriter(rewrite);

结果是,url“/Page1From”将被重定向到“Page1To”,url“Page2From”将显示“/Page2To”的内容而无需重定向。

我想通过使用数据库中的数据来实现 AddRewrite 方法,但我只找到了如何使用自定义规则进行重定向。

var rewrite = new RewriteOptions()
    .AddRedirect("Page1From", "Page1To")        // Redirect
    .AddRewrite("Page2From", "Page2To", true);  // Rewrite
    .Add(new MoviesRedirectRule(                // Custom Rule
        matchPaths: new[] { "/Page3From1", "/Page3From2", "/Page3From3" },
        newPath: "/Page3To"));

app.UseRewriter(rewrite);

规则如下:

public class MoviesRedirectRule : IRule
{
    private readonly string[] matchPaths;
    private readonly PathString newPath;

    public MoviesRedirectRule(string[] matchPaths, string newPath)
    {
        this.matchPaths = matchPaths;
        this.newPath = new PathString(newPath);
    }

    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;

        // if already redirected, skip
        if (request.Path.StartsWithSegments(new PathString(this.newPath)))
        {
            return;
        }

        if (this.matchPaths.Contains(request.Path.Value))
        {
            var newLocation = $"{this.newPath}{request.QueryString}";

            var response = context.HttpContext.Response;
            response.StatusCode = StatusCodes.Status302Found;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = newLocation;
        }
    }
}

这将重定向以下网址:

  • /Page3From1
  • /Page3From2
  • /Page3From3

到/Page3To

我想创建类似的东西,它不会重定向,但我想重写 url,以便 url 保持不变,但它会显示指定 URL 的内容。

谁能告诉我我必须对响应对象进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: asp.net-core-2.0 razor-pages


    【解决方案1】:

    当您调用AddRewrite() 时添加的RewriteRule 只是替换请求中的URI 部分(link to source code):

    request.Scheme = scheme;
    request.Host = host;
    request.Path = pathString;
    request.QueryString = query.Add(request.QueryString);
    

    在您的情况下,由于您只替换 Path 部分,ApplyRule 方法将很简单:

    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
    
        if (matchPaths.Contains(request.Path.Value))
        {
            request.Path = newPath;
            context.Result = RuleResult.SkipRemainingRules;
        }
    }
    

    【讨论】:

    • 有时候事情很简单,让你相信它很难实现。非常感谢您的回答。
    猜你喜欢
    • 2020-09-03
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多