路由跟URL 重寫的功能性略有不同。路由是將Request 找到對應的服務,而URL 重寫是為了推卸責任轉送Request。
本篇將簡單介紹下ASP.NET Core的URL重寫(URL Rewrite)。
URL Rewrite 注冊
URL Rewriting Middleware需要Microsoft.AspNetCore.Rewrite套件。
ASP.NET Core 2.0以上版本,預設是參考Microsoft.AspNetCore.All,已經包含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重寫規則后,傳入給URL Rewriting Middleware。
URL重寫規則,主要有分兩種方式:
- URL重寫(URL Rewrite)
上例的AddRewrite就是URL重寫。 - URL轉址(URL Redirect)
上例的AddRedirect就是URL轉址。
URL 重寫
URL 重寫是屬於Server 端的轉換事件,當Client 端Request 來的時候,發現原網址已經被換掉了,就會自動回傳新網址的內容。情境如下:

上例AddRewrite有用到三個參數,當URL符合參數1時,就將參數2路由的內容回傳給Client。
而參數3是用來加速URL匹配的參數,類似switch的break。若將skipRemainingRules設為true,當找到匹配條件,就不再繼續往下找符合其他參數1的規則。
- 參數1支持正則表達式(Regular Expressions)。
范例結果:

URL 轉址
URL 轉址是屬於Client 端的轉換事件,當Client 端Request 來的時候,發現原網址已經被換掉了,Server 會先回傳給Client 告知新網址,再由Client 重新Request 新網址。情境如下:

AddRedirect的使用方式類似AddRewrite,當URL符合參數1時,就會回傳參數2的URL給Client。
- 參數1同樣支持正則表達式(Regular Expressions)。
URL轉址預設都是回傳HTTP Status Code 302,也可以在參數3指定回傳的HTTP Status Code。
通常轉址的HTTP Status Code都是用301或302 ,URL轉址對“人”的行為來說沒有什么意義,反正就是幫忙從A轉到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是要讓搜索引擎知道,該網址已經永久轉移到另一個地方。通常用於網站搬家或網站改版,新舊版本路徑不相同,要重新對應的情況。
范例結果:

- HTTP Status Code 302
302是告知搜索引擎,雖然這次被轉址,但只是暫時性的。通常用於網站維護時,暫時原網址轉移到別的地方,如維護公告頁面。
范例結果:

正則表達式
AddRewrite及AddRedirect都支持正則表達式的使用,且能把來源的URL通過正則表達式變成參數,帶入新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
轉址到http://localhost:5000/products/p123 - 當連到
http://localhost:5000/api/first/second/third
轉址到http://localhost:5000/api?p1=first&p2=second&p3=third
通過正則表達式做URL 轉址,對於網站新舊改版來說,非常好用。
參考
URL Rewriting Middleware in ASP.NET Core
老司機發車啦:https://github.com/SnailDev/SnailDev.NETCore2Learning
