路由跟URL 重寫的功能性略有不同。路由是將Request 找到對應的服務,而URL 重寫是為了推卸責任轉送Request。本篇將簡單介紹下ASP.NET Core的URL重寫(URL Rewrite)。 URL Rewrite 註冊 URL Rewriting Middleware需要Micros ...
路由跟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