ASP.NET Core 2 學習筆記(八)URL重寫


路由跟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.csConfigureIApplicationBuilder使用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是告知搜索引擎,雖然這次被轉址,但只是暫時性的。通常用於網站維護時,暫時原網址轉移到別的地方,如維護公告頁面。
范例結果:

   

正則表達式

AddRewriteAddRedirect都支持正則表達式的使用,且能把來源的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM