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

路由跟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)站新舊改版來說,非常好用。

參考

URL Rewriting Middleware in ASP.NET Core

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容