自定义 URL 重写
Custom URL Rewriting
我想重写一个url,使用UseRewriter中间件很简单。
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;
}
}
}
这将重定向以下 urls:
- /Page3From1
- /Page3From2
- /Page3From3
到/Page3To
我想创建类似的东西,不会重定向,但我想重写 url,这样 url 将保持不变,但它会显示指定 [=45] 的内容=].
谁能告诉我必须对响应对象做哪些更改才能使其正常工作?
RewriteRule
调用 AddRewrite()
时添加的只是替换请求中的 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;
}
}
我想重写一个url,使用UseRewriter中间件很简单。
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;
}
}
}
这将重定向以下 urls:
- /Page3From1
- /Page3From2
- /Page3From3
到/Page3To
我想创建类似的东西,不会重定向,但我想重写 url,这样 url 将保持不变,但它会显示指定 [=45] 的内容=].
谁能告诉我必须对响应对象做哪些更改才能使其正常工作?
RewriteRule
调用 AddRewrite()
时添加的只是替换请求中的 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;
}
}