路由跟URL 重寫的功能性略有不同。路由是將Request 找到對應的服務,而URL 重寫是為了推卸責任轉(zhuǎn)送Request。
本篇將簡單介紹下ASP.NET Core的URL重寫(URL Rewrite)。
URL Rewrite 注冊
URL Rewriting Middleware需要Microsoft.AspNetCore.Rewrite套件。
ASP.NET Core 2.0以上版本,預設是參考Microsoft.AspNetCore.All,已經(jīng)包含Microsoft.AspNetCore.Rewrite,所以不用再安裝。
要使用URL重寫,在Startup.cs的Configure對IApplicationBuilder使用UseRewriter方法注冊URL Rewriting Middleware:
Startup.cs
// ...
public class Startup
{
public void Configure(IApplicationBuilder app)
{
var rewrite = new RewriteOptions()
.AddRewrite("about.aspx", "home/about", skipRemainingRules: true)
.AddRedirect("first", "home/index");
app.UseRewriter(rewrite);
// ...
}
}
通過RewriteOptions建立URL重寫規(guī)則后,傳入給URL Rewriting Middleware。
URL重寫規(guī)則,主要有分兩種方式:
- URL重寫(URL Rewrite)
上例的AddRewrite就是URL重寫。 - URL轉(zhuǎn)址(URL Redirect)
上例的AddRedirect就是URL轉(zhuǎn)址。
URL 重寫
URL 重寫是屬于Server 端的轉(zhuǎn)換事件,當Client 端Request 來的時候,發(fā)現(xiàn)原網(wǎng)址已經(jīng)被換掉了,就會自動回傳新網(wǎng)址的內(nèi)容。情境如下:

上例AddRewrite有用到三個參數(shù),當URL符合參數(shù)1時,就將參數(shù)2路由的內(nèi)容回傳給Client。
而參數(shù)3是用來加速URL匹配的參數(shù),類似switch的break。若將skipRemainingRules設為true,當找到匹配條件,就不再繼續(xù)往下找符合其他參數(shù)1的規(guī)則。
-
參數(shù)1支持正則表達式(Regular Expressions)。
范例結(jié)果:
URL 轉(zhuǎn)址
URL 轉(zhuǎn)址是屬于Client 端的轉(zhuǎn)換事件,當Client 端Request 來的時候,發(fā)現(xiàn)原網(wǎng)址已經(jīng)被換掉了,Server 會先回傳給Client 告知新網(wǎng)址,再由Client 重新Request 新網(wǎng)址。情境如下

AddRedirect的使用方式類似AddRewrite,當URL符合參數(shù)1時,就會回傳參數(shù)2的URL給Client。
- 參數(shù)1同樣支持正則表達式(Regular Expressions)。
URL轉(zhuǎn)址預設都是回傳HTTP Status Code 302,也可以在參數(shù)3指定回傳的HTTP Status Code。
通常轉(zhuǎn)址的HTTP Status Code都是用301或302 ,URL轉(zhuǎn)址對“人”的行為來說沒有什么意義,反正就是幫忙從A轉(zhuǎn)到B;主要差異是給“搜索引擎”理解的。
Startup.cs
// ...
public class Startup
{
public void Configure(IApplicationBuilder app)
{
var rewrite = new RewriteOptions()
.AddRedirect("first", "home/index", 301);
app.UseRewriter(rewrite);
// ...
}
}
-
HTTP Status Code 301
301是要讓搜索引擎知道,該網(wǎng)址已經(jīng)永久轉(zhuǎn)移到另一個地方。通常用于網(wǎng)站搬家或網(wǎng)站改版,新舊版本路徑不相同,要重新對應的情況。
范例結(jié)果:
-
HTTP Status Code 302
302是告知搜索引擎,雖然這次被轉(zhuǎn)址,但只是暫時性的。通常用于網(wǎng)站維護時,暫時原網(wǎng)址轉(zhuǎn)移到別的地方,如維護公告頁面。
范例結(jié)果:
正則表達式
AddRewrite及AddRedirect都支持正則表達式的使用,且能把來源的URL通過正則表達式變成參數(shù),帶入新URL。
Startup.cs
// ...
public class Startup
{
public void Configure(IApplicationBuilder app)
{
var rewrite = new RewriteOptions()
.AddRedirect(@"products.aspx?id=(\w+)", "prosucts/$1", 301)
.AddRedirect(@"api/(.*)/(.*)/(.*)", "api?p1=$1&p2=$2&p3=$3", 301);
app.UseRewriter(rewrite);
// ...
}
}
- 當連到
http://localhost:5000/products.aspx?id=p123
轉(zhuǎn)址到http://localhost:5000/products/p123 - 當連到
http://localhost:5000/api/first/second/third
轉(zhuǎn)址到http://localhost:5000/api?p1=first&p2=second&p3=third
通過正則表達式做URL 轉(zhuǎn)址,對于網(wǎng)站新舊改版來說,非常好用。


