ASP.NET Core URL Rewrite中间件

  URL重写是基于一个或多个预置规则修改请求URL的行为。URL重写在资源位置和访问地址之间创建了一种抽象,这样二者之间就减少了紧密的联系。URL重写有多种适用的场景:

临时或永久移动或替换服务器资源,同时为这些资源保持稳定的访问

为不同应用程序或同一个应用程序的不同区域的拆分请求处理

根据请求移除、添加、重新组织URL段(segment)

SEO优化

允许使用友好的公共URL来帮助人们通过链接预测找到内容

将不安全的请求重定向到安全端点

图片防盗链

  可以通过多种方式定义改变URL的规则,包括正则表达式、Apache mod_rewrite模块规则、IIS重写模块规则和自定义规则逻辑。本文介绍URL重写及说明如何在ASP.NET Core应用中使用URL重写中间件。

注意:URL重写可能会降低应用的性能,您应该尽可能的限制规则的数量和规则的复杂性。

 URL重定向和URL重写

  从字面意思上看URL重定向和URL重写的差异并不明显,但二者在提供资源给客户端方面都有重要意义。ASP.NET Core的URL重写中间件能够同时满足二者的需求。URL重定向是客户端操作,指示客户端在另一个地址访问资源,需要额外往返服务器。当客户端对资源发出请求时,返回到客户端的重定向URL将显示在浏览器的地址栏中。例如/resource被重定向到/different-resource时:客户端请求/resource,服务端响应客户端应在/different-resource获取资源,其响应的状态码会指示重定向是临时的还是永久的,然后客户端会向/different-resource发送一个新请求获取资源。

ASP.NET Core URL Rewrite中间件

  将请求重定向到其他URL时,可以指定重定向是永久还是临时。301(Moved Permanently)状态代码用于表明资源具有新的永久URL,并且希望客户端将来对该资源的所有请求都应使用新URL。当收到301状态码时客户端可以缓存响应。302(Found)状态码用于临时重定向,所以客户端不应该存储和重用该URL。状态码的含义请参考这里。URL重写是服务器端操作,用于从不同的资源地址提供资源。URL重写不需要额外的往返服务器,并且重写后的URL不会返回给客户端,也不会出现在客户端的地址栏中。当/resource被重写为/different-resource时:客户端请求/resource,服务端在内部从/different-resource获取资源并响应给客户端。尽管客户端也许可以从重写后的URL处获取资源,但客户端并不会收到资源存在于重写后URL的通知。

ASP.NET Core URL Rewrite中间件

何时使用URL重写中间件

  当无法在Windows Server上使用IIS重写模块、Apache服务器上的Apache mod_rewrite模块、Nginx上的URL重写或应用程序托管在HTTP.sys服务器(以前称为WebListener)上时,请使用URL重写中间件。推荐在IIS,Apache或Nginx中使用基于服务器的URL重写技术的主要原因是中间件不支持这些模块的全部功能,并且中间件的性能可能无法达到这些模块的性能。但是,这些服务器重写模块的某些功能不适用于ASP.NET Core项目,例如IIS Rewrite模块的IsFile和IsDirectory。在这些情况下,请改用中间件。

包引用

  要在项目中使用URL重写中间件,请添加Microsoft.AspNetCore.Rewrite包的引用。该功能适用于ASP.NET Core 1.1或更高版本的应用程序。

配置重写及重定向规则

  通过RewriteOptions类实例的扩展方法来建立URL重写和重定向规则,按照你希望处理的顺序将这些规则链接起来,然后通过使用app.UseRewriter(options)将URL重写选项传递到请求管道,以下是几种重写、重定向的配置代码,后面会针对每种配置单独解释:

public void Configure(IApplicationBuilder app) { using (StreamReader apacheModRewriteStreamReader = File.OpenText("ApacheModRewrite.txt")) using (StreamReader iisUrlRewriteStreamReader = File.OpenText("IISUrlRewrite.xml")) { var options = new RewriteOptions() .AddRedirect("redirect-rule/(.*)", "redirected/$1") .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", skipRemainingRules: true) .AddApacheModRewrite(apacheModRewriteStreamReader) .AddIISUrlRewrite(iisUrlRewriteStreamReader) .Add(MethodRules.RedirectXMLRequests) .Add(new RedirectImageRequests(".png", "/png-images")) .Add(new RedirectImageRequests(".jpg", "/jpg-images")); app.UseRewriter(options); } app.Run(context => context.Response.WriteAsync( $"Rewritten or Redirected Url: " + $"{context.Request.Path + context.Request.QueryString}")); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygxpx.html