URL重写是基于一个或多个预定义规则更改请求URL的过程。 您可以利用ASP.NET Core中的URL重写中间件来处理URL重定向以及URL重写。 本文讨论了如何在ASP.NET Core中实现URL重写。
若要使用本文中说明的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
创建一个ASP.NET Core API项目
首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.NET Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 在接下来显示的“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。 我将在这里使用ASP.NET Core 3.0。
- 选择“ API”作为项目模板以创建新的ASP.NET Core API应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
现在,您应该在Visual Studio中有一个新的ASP.NET Core API项目。 我们将在本文的后续部分中使用该项目。
通过NuGet安装URL重写中间件
现在,您已经在Visual Studio中创建了ASP.NET Core应用程序,接下来应该做的是安装必要的NuGet包。 要使用ASP.NET Core中的URL重写中间件,您应该在项目中安装Microsoft.AspNetCore.Rewrite程序包。
您可以从Visual Studio 2019 IDE中的NuGet程序包管理器安装此程序包。 或者,您可以运行以下命令以通过.NET CLI安装此软件包。
dotnet add package Microsoft.AspNetCore.Rewrite
URL重定向和URL重写
URL重定向和URL重写不同。 在URL重定向中,服务器将HTTP状态代码301或302发送回客户端,并要求客户端使用另一个URL访问资源。 然后,客户端将适当地更新URL,并使用新的URL访问资源。 因此,URL重定向发生在客户端,即它是客户端操作,并且需要往返服务器。
相比之下,URL重写是服务器端的操作。 它是根据一个或多个预定义规则修改请求URL的过程。 在URL重写中,重写的URL不发送回客户端; 客户端永远不会知道该资源与客户端所请求的资源不在同一个位置。 请注意,URL重写并不是什么新鲜事物-自遗留ASP.NET以来就已经存在。 在URL重写中,URL的重写发生在服务器端,并且不需要往返。
在ASP.NET Core中配置URL重定向
您可以在Startup类中配置URL重写和URL重定向。 在Startup.cs文件的Configure方法中,添加以下代码以将HTTP请求重定向到HTTPS。
app.UseRewriter(new RewriteOptions()
.AddRedirectToHttps());
在ASP.NET Core中配置URL重写
以下代码段是URL重写的示例。 请注意如何使用AddRewrite方法修改请求URL。
var rewrite = new RewriteOptions()
.AddRewrite("api/values", "api/default", true);
app.UseRewriter(rewrite);
在执行应用程序时,您会发现DefaultController的HttpGet方法被调用,但是Web浏览器显示了以下URL:
http://localhost:52137/api/values
您还可以使用正则表达式来指定规则,如下面的代码片段所示。
var rewrite = new RewriteOptions()
.AddRewrite(@"^Home/User?Code=(\d+)", "Home/$1", true);
app.UseRewriter(rewrite);
在ASP.NET Core中创建自定义URL重写规则
要使用复杂的规则,您也可以创建一个自定义规则。 为此,您需要创建一个扩展IRule接口并实现ApplyRule方法的类,如下面给出的代码片段所示。
public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule
{
public void ApplyRule(RewriteContext context)
{
throw new NotImplementedException();
}
}
以下代码段说明了如何使用ApplyRule方法。 请注意,此处显示的ApplyRule方法仅用于说明目的。 您可以根据自己的要求进行更改。
public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule
{
public void ApplyRule(RewriteContext context)
{
var request = context.HttpContext.Request;
var host = request.Host;
if (host.Host.Contains("localhost",
StringComparison.OrdinalIgnoreCase))
{
if(host.Port == 80)
{
context.Result = RuleResult.ContinueRules;
return;
}
}
var response = context.HttpContext.Response;
response.StatusCode = (int)HttpStatusCode. BadRequest;
context.Result = RuleResult.EndResponse;
}
}
将自定义规则添加到ASP.NET Core中的规则集合
您可以在Configure方法中将自定义规则添加到规则集合中,如下面给出的代码片段所示。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var options = new RewriteOptions();
options.Rules.Add(new CustomRule())
app.UseRewriter(options);
}
URL重写使地址与基础资源分离。 您可以利用URL重写来提供用户友好的URL,这些URL更加简单易记,并且对搜索引擎更有意义。
From: https://www.infoworld.com/article/3445867/how-to-use-url-rewriting-middleware-in-aspnet-core.html