如何在 ASP.NET Core 中使用 URL Rewriting 中間件

URL rewriting 是根據預先配置好的一組規則去修改 request url,值得注意的是:URL Rewriting 的重寫功能和 url 重定向 是兩個概念,本篇我們就來討論下如何在 ASP.NET Core 中對 url 進行 rewriting。

安裝 URL Rewriting 中間件

要想使用 URL Rewriting 功能,需要通過 nuget 引用 Microsoft.AspNetCore.Rewrite 包,可以通過 Visual Studio 2019 的 NuGet package manager 可視化界面安裝 或者 通過 NuGet package manager 命令行工具輸入以下命令:


dotnet add package Microsoft.AspNetCore.Rewrite

url重定向 和 url重寫

url重定向url重寫 是兩個完全不同的概念,url重定向是 server 端返回 Http Status Code 301 或者 302 給 客戶端並且告訴客戶端使用另一個鏈接訪問資源,客戶端拿到新鏈接後實現跳轉,從這個過程中可以看出,這個操作是發生在客戶端,而且還多了一個不可迴避的 round-trip

相反,url重寫 是server端的操作,它會根據預先指定的一組規則去修改request url,在 rewriting 的過程中,修改後的 request url 不會和 重定向 一樣再發送給客戶端,只要是在一個請求內,client 根本不關心 server 端內部是如何實現資源切換的,值得注意的是,URL rewriting 也不是什麼新的技術,在 ASP.NET 時代就有了。

總的來說,url重寫 是發生在 server 端,並且沒有所謂的 round-trip

配置 url 重定向

可以在 Startup 類中進行 URL rewritingURL redirection 功能配置,舉個例子,實現 http 請求自動跳轉成 https。


    public class Startup
    {
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRewriter(new RewriteOptions().AddRedirectToHttps());
        }
    }

配置 URL rewriting

下面的代碼展示了 URL rewriting,請注意 request url 已經被 AddRewrite 的規則所監視。


    public class Startup
    {
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles();

            //rewrite
            var rewrite = new RewriteOptions().AddRewrite("Home/Index", "Home/Privacy", true);
            app.UseRewriter(rewrite);

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }

從圖中可以看出,url 請求的是 Home/Index,顯示的是 Home/Privacy 內容,如果你有更加複雜的業務需求,可以使用 正則表達式 來定義規則,如下代碼所示:


        var rewrite = new RewriteOptions().AddRewrite(@"^Home/User?Code=(\d+)", "Home/$1", true);
        app.UseRewriter(rewrite);

使用自定義的 URL rewriting

如果正則表達式都不能滿足需求,完全可以 自定義 來實現深度定製,只需要實現 IRule 接口中的 ApplyRule 方法即可,如下代碼所示:


    public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule
    {
        public void ApplyRule(RewriteContext context)
        {
            throw new NotImplementedException();
        }
    }

下面的代碼展示瞭如何使用 ApplyRule,不過這裏只是爲了演示目的,你可以根據自己的需求來實現。


    public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule
    {
        public void ApplyRule(RewriteContext context)
        {
            var request = context.HttpContext.Request;
            var host = request.Host;
            if (host.Host.Contains("localhost",
             StringComparison.OrdinalIgnoreCase))
            {
                if(host.Port == 80)
                {
                    context.Result = RuleResult.ContinueRules;
                    return;
                }               
            }
            var response = context.HttpContext.Response;
            response.StatusCode = (int)HttpStatusCode. BadRequest;
            context.Result = RuleResult.EndResponse;
        }
    }

將 自定義規則 添加到 rule 集合

可以在 Startup.Configure 方法中將自定義的rule規則添加到 rule 集合中,如下代碼所示:


  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
        var options = new RewriteOptions();
        options.Rules.Add(new CustomRule())
         app.UseRewriter(options);
  }

總結一下:URL rewriting 切斷了 url地址 和 資源 的映射關係,你可以利用這項技術定義一些非常語義化的 url 地址,也方便 搜索引擎 收錄。

譯文鏈接:https://www.infoworld.com/article/3445867/how-to-use-url-rewriting-middleware-in-aspnet-core.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章