ASP.NET Core 2.0網址重定向方法

kboypkb發表於2021-09-09

 如何在ASP.NET Core 2.0中實現網址重定向?

答案

新建一個空專案,在Startup.cs檔案中,配置RewriteOptions引數並新增網址重定向中介軟體(UseRewriter):

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var rewrite = new RewriteOptions()
        .AddRedirect("films", "movies")
        .AddRewrite("actors", "stars", true);
 
    app.UseRewriter(rewrite);
 
    app.Run(async (context) =>
    {
        var path = context.Request.Path;
        var query = context.Request.QueryString;
        await context.Response.WriteAsync($"New URL: {path}{query}");
    });
}  

執行,並在瀏覽器位址列輸入:,透過客戶端除錯工具觀察重定向過程:

圖片描述

在位址列輸入:,再次觀察重定向過程:

圖片描述

討論

網址重定向就是根據使用者自定義規則來修改請求的網址,目的是為了將伺服器資源和瀏覽器網址解繫結。這樣做可能是出於安全考慮, 搜尋引擎最佳化(SEO),使用者友好網址,將HTTP重定向到HTTPS等多種目的。

當你無法使用Web伺服器(IIS,Apache,Nginx)的重定向功能時,ASP.NET Core提供了一個可選項 - 請求網址重定向中介軟體。然後它的效能和功能比不上Web伺服器的重定向。

重定向中介軟體可以做兩件事情:客戶端重定向和伺服器重寫:

重定向(客戶端)

這是一個客戶端操作,工作流程如下:

1. 客戶端請求一個資源,比如 /films

2. 伺服器返回301(Moved Permanently)或者302(Found)狀態碼,並在響應頭中新增Location屬性,用來指示瀏覽器請求新的地址(比如/movies)。

3. 客戶端請求新的地址,並顯示在瀏覽器的位址列中。

重寫(服務端)

它是一個伺服器端操作,工作流程如下:

1. 客戶端請求一個資源,比如 /actors

2. 伺服器將其內部對映到新的地址(比如/stars)並且返回200(OK)。

在此過程中,客戶端並不知道伺服器端的內部對映操作,因此使用者看到的瀏覽器位址列依然顯示的是最初請求地址。

規則

重定向和重寫規則可以是正規表示式,更加詳細的資訊請參考:

自定義重定向規則

我們也可以自定義重定向規則,透過一個繼承自IRule介面的類來實現:

public class MoviesRedirectRule : IRule
{
    private readonly string[] _matchPaths;
    private readonly string _newPath;
 
    public MoviesRedirectRule(string[] matchPaths, string newPath)
    {
        _matchPaths = matchPaths;
        _newPath = newPath;
    }
 
    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
 
        // 已經是目標地址了,直接返回
        if (request.Path.StartsWithSegments(new PathString(_newPath)))
        {
            return;
        }
 
        if (_matchPaths.Contains(request.Path.Value))
        {
            var newLocation = $"{_newPath}{request.QueryString}";
 
            var response = context.HttpContext.Response;
            response.StatusCode = StatusCodes.Status302Found;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = newLocation;
        }
    }
}

然後在Configure()中,將此自定義規則新增到RewriteOptions裡面:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var rewrite = new RewriteOptions()
        .Add(new MoviesRedirectRule(
            matchPaths: new string[] { "/films", "/features", "/albums" },
            newPath: "/movies"));
 
 
    app.UseRewriter(rewrite);
 
    app.Run(async (context) =>
    {
        var path = context.Request.Path;
        var query = context.Request.QueryString;
        await context.Response.WriteAsync($"New URL: {path}{query}");
    });
}

執行,在位址列輸入:?id=123,觀察重定向過程:

圖片描述

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1916/viewspace-2808834/,如需轉載,請註明出處,否則將追究法律責任。

相關文章