URL 重写可能会降低应用的性能。 如果可行,应限制规则的数量和复杂度。
何时使用 URL 重写中间件
如果无法使用以下方法,请使用 URL 重写中间件:
此外,如果应用程序在 HTTP.sys 服务器(旧称 WebListener)上托管,请使用中间件。
使用 IIS、Apache 和 Nginx 中的基于服务器的 URL 重写技术的主要原因:
-
中间件不支持这些模块的完整功能。
服务器模块的一些功能不适用于 ASP.NET Core 项目,例如 IIS 重写模块的
IsFile
和IsDirectory
约束。 在这些情况下,请改为使用中间件。 -
中间件性能与模块性能不匹配。
基准测试是确定哪种方法会最大程度降低性能或降低的性能是否可忽略不计的唯一方法。
Package
URL 重写中间件由 Microsoft.AspNetCore.Rewrite 包提供,该包隐式包含在 ASP.NET Core 应用中。
扩展和选项
通过使用扩展方法为每条重写规则创建 RewriteOptions 类的实例,建立 URL 重写和重写定向规则。 按所需的处理顺序链接多个规则。 使用 UseRewriter 将 RewriteOptions
添加到请求管道时,它会被传递到 URL 重写中间件:
1 public void Configure(IApplicationBuilder app) 2 { 3 using (StreamReader apacheModRewriteStreamReader = 4 File.OpenText("ApacheModRewrite.txt")) 5 using (StreamReader iisUrlRewriteStreamReader = 6 File.OpenText("IISUrlRewrite.xml")) 7 { 8 var options = new RewriteOptions() 9 .AddRedirect("redirect-rule/(.*)", "redirected/$1") 10 .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 11 skipRemainingRules: true) 12 .AddApacheModRewrite(apacheModRewriteStreamReader) 13 .AddIISUrlRewrite(iisUrlRewriteStreamReader) 14 .Add(MethodRules.RedirectXmlFileRequests) 15 .Add(MethodRules.RewriteTextFileRequests) 16 .Add(new RedirectImageRequests(".png", "/png-images")) 17 .Add(new RedirectImageRequests(".jpg", "/jpg-images")); 18 19 app.UseRewriter(options); 20 } 21 22 app.UseStaticFiles(); 23 24 app.Run(context => context.Response.WriteAsync( 25 $"Rewritten or Redirected Url: " + 26 $"{context.Request.Path + context.Request.QueryString}")); 27 }
URL 重写
使用 AddRewrite 创建重写 URL 的规则。 第一个参数包含用于匹配传入 URL 路径的正则表达式。 第二个参数是替换字符串。 第三个参数 skipRemainingRules: {true|false}
指示如果当前规则适用,中间件是否要跳过其他重写规则。
.AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", skipRemainingRules: true)
动态添加重写规则
#在configService 中添加 services.AddSingleton<RewriteOptions>(); # config中添加 RewriteOptions options = app.ApplicationServices.GetService(typeof(RewriteOptions)) as RewriteOptions; options.AddRewrite(@"(.*).jsp", "$1", skipRemainingRules: true); app.UseRewriter(options); #在后续的任意地方获取并添加重写规则 public IActionResult Index() { //IConfiguration configura = HttpContextUtil.ServiceProvider.GetService(typeof(IConfiguration)) as IConfiguration; //IOptions<RewriteOptions> options = HttpContextUtil.ServiceProvider.GetService(typeof(IOptions<RewriteOptions>)) as IOptions<RewriteOptions>; rwOptions.AddRewrite(@"(.*).html", "$1", skipRemainingRules: true); return Content("12"); }