URL rewriting
是根據預先配置好的一組規則去修改 request url,值得注意的是:URL Rewriting 的重寫功能和 url 重定向 是兩個概念,本篇我們就來討論下如何在 ASP.NET Core 中對 url 進行 rewriting。
安裝 URL Rewriting 中間件
要想使用 URL Rewriting
功能,需要通過 nuget 引用 Microsoft.AspNetCore.Rewrite
包,可以通過 Visual Studio 2019 的 NuGet package manager
可視化界面安裝 或者 通過 NuGet package manager
命令行工具輸入以下命令:
dotnet add package Microsoft.AspNetCore.Rewrite
url重定向 和 url重寫
url重定向
和 url重寫
是兩個完全不同的概念,url重定向是 server 端返回 Http Status Code 301 或者 302 給 客戶端並且告訴客戶端使用另一個鏈接訪問資源,客戶端拿到新鏈接後實現跳轉,從這個過程中可以看出,這個操作是發生在客戶端,而且還多了一個不可迴避的 round-trip
。
相反,url重寫
是server端的操作,它會根據預先指定的一組規則去修改request url,在 rewriting 的過程中,修改後的 request url 不會和 重定向
一樣再發送給客戶端,只要是在一個請求內,client 根本不關心 server 端內部是如何實現資源切換的,值得注意的是,URL rewriting
也不是什麼新的技術,在 ASP.NET
時代就有了。
總的來說,url重寫
是發生在 server 端,並且沒有所謂的 round-trip
。
配置 url 重定向
可以在 Startup 類中進行 URL rewriting
和 URL redirection
功能配置,舉個例子,實現 http 請求自動跳轉成 https。
public class Startup
{
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRewriter(new RewriteOptions().AddRedirectToHttps());
}
}
配置 URL rewriting
下面的代碼展示了 URL rewriting
,請注意 request url 已經被 AddRewrite 的規則所監視。
public class Startup
{
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
//rewrite
var rewrite = new RewriteOptions().AddRewrite("Home/Index", "Home/Privacy", true);
app.UseRewriter(rewrite);
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
從圖中可以看出,url 請求的是 Home/Index
,顯示的是 Home/Privacy
內容,如果你有更加複雜的業務需求,可以使用 正則表達式
來定義規則,如下代碼所示:
var rewrite = new RewriteOptions().AddRewrite(@"^Home/User?Code=(\d+)", "Home/$1", true);
app.UseRewriter(rewrite);
使用自定義的 URL rewriting
如果正則表達式都不能滿足需求,完全可以 自定義 來實現深度定製,只需要實現 IRule
接口中的 ApplyRule
方法即可,如下代碼所示:
public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule
{
public void ApplyRule(RewriteContext context)
{
throw new NotImplementedException();
}
}
下面的代碼展示瞭如何使用 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;
}
}
將 自定義規則 添加到 rule 集合
可以在 Startup.Configure
方法中將自定義的rule規則添加到 rule 集合中,如下代碼所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var options = new RewriteOptions();
options.Rules.Add(new CustomRule())
app.UseRewriter(options);
}
總結一下:URL rewriting 切斷了 url地址 和 資源 的映射關係,你可以利用這項技術定義一些非常語義化的 url 地址,也方便 搜索引擎 收錄。
譯文鏈接:https://www.infoworld.com/article/3445867/how-to-use-url-rewriting-middleware-in-aspnet-core.html