12/08/2018, 16:44

URL Rewrite Middleware trong ASP.NET Core

Url rewriting là một hành động sửa đổi request Urls dựa trên một hoặc nhiều quy tắc được định nghĩa trước. Url rewriting tạo một abstraction giữa resource locations và địa chỉ của chúng, như vậy rằng locations và địa chỉ là không được liên kết chặt chẽ. Có một số kịch bản nơi Urls rewriting là có ...

Url rewriting là một hành động sửa đổi request Urls dựa trên một hoặc nhiều quy tắc được định nghĩa trước. Url rewriting tạo một abstraction giữa resource locations và địa chỉ của chúng, như vậy rằng locations và địa chỉ là không được liên kết chặt chẽ. Có một số kịch bản nơi Urls rewriting là có giá trị:

  • Di chuyển hoặc thay thế tài nguyên server tạm thời hoặc lâu dài trong khi vẫn bảo đảm sự ổn định của locators cho những tài nguyên
  • Chia việc xử lý request xuyên suốt trên những app khác nhau hoặc những nơi khác nhau trong app
  • Gỡ bỏ, thêm mới hoặc tổ chức lại Urls segments của requests tới
  • Tối ưu Url công khai cho Search Engine Optimization (SEO)
  • Cho phép việc sử dụng của friendly public Urls để hỗ trợ mọi người tiên đoán nội dung chúng sẽ tìm bởi link theo đó
  • Điều hướng những requests không an toàn tới endpoints an toàn
  • Ngăn chặn image hotlinking

Bạn có thể định nghĩa những quy tắc cho việc thay đổi Url trong một vài cách, bao gồm regex, Apache mode_rewrite module, IIS Rewrite Module và sử dụng custom rule logic. Bài viết này giới thiệu Url rewrite với những hướng dẫn làm thế nào để sử dụng URL Rewriting Middleware trong ASP.NET.

Sự khác nhau trong từ URL redirect và URL rewrite có thể dường như tế nhị lúc đầu nhưng lại có ý nghĩa quan trọng cho việc cung cấp resources tới clients. URL Rewriting Middleware của ASP.NET Core có khả năng đáp ứng cho cả hai. Một URL redirect là một xử lý client-side, nơi client được hướng dẫn để truy cập tại địa chỉ khác. Điều này yêu cầu một chuyến vòng quanh máy chủ và redirect URL trả về tới client xuất hiện trên thanh địa chỉ của trình duyệt khi client làm một request mới tới resource.

Nếu /resource được điều hướng tới /different-resource, client yêu cầu /resuource, server trả về cái mà client nên nhận được resource tại /different-resource với một status code chỉ ra rằng redirect là hoặc tạm thời hoặc là lâu dài. Client thực thi một request mới cho tài nguyên tại redirect URL.

Một URL rewrite là một xử lý server-side để cung cấp một resource từ một địa chỉ resouce khác. Rewriting một URL không yêu cầu một chuyến vòng quanh server. Rewritten URL không trả về client và không xuất hiện trên thanh địa chỉ của trình duyệt. Khi /resource được viết lại thành /different-resource client yêu cầu /resource và server một cách nội bộ lấy tài nguyên tại /different-resource. Mặc dù client có thể nhận tài nguyên tại URL được viết lại, client không muốn thông báo rằng resource tồn tại ở URL đã được viết lại khi nó làm một request và nhận về response.

Sử dụng URL Rewriting Middleware khi bạn không thể sử dụng URL Rewrite module với IIS trên Window, Apache mod_rewrite module trên Apache Server. URL rewriting trên Nginx hoặc ứng dụng của bạn được host trên HTTP.sys server. Những lý do chính để sử dụng những công nghệ server-based URL rewriting trên IIS, Apace hoặc Nginx là rằng middleware không hỗ trợ đầy đủ tính năng những module này và hiệu suất của middleware có thể không khớp với cái của modules. Tuy nhiên, có một số tính năng của server modules cái mà không làm việc với dự án ASP.NET Core, giống như IsFile và IsDirectorylà trở ngại của IIS Rewrite module, và thay thế điều này bởi middleware.

Để đưa middleware trong dự án của bạn, thêm một reference tới package Microsoft.AspNetCore.Rewrite. Tính năng này có sẵn cho apps sử dụng ASP.NET Core 1.1 hoặc mới hơn.

Thành lập quy tắc URL rewrite và redirect của bạn bởi việc tạo thể hiện của class RewriteOptions với extension methods cho mỗi quy tắc đó. Xâu chuỗi nhiều quy tắc trong một thứ tự cái mà bạn mong muốn chúng xử lý. RewriteOptions passed tới URL Rewriting Middleware như một request pipeline được thêm vào với app.UseRewriter(options);

using (StreamReader apacheModRewriteStreamReader = File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader = File.OpenText("IISUrlRewrite.xml")) 
{
    var options = new RewriteOptions()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(d+)/(d+)", "rewritten?var1=$1&var2=$2", skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXMLRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

    app.UseRewriter(options);
}

5.1. URL redirect

Sử dụng AddRedirect để điều hướng requests. Tham số đầu tiên chữa regex của bạn cho việc khớp một đường dẫn URL đang đến. Tham số thứ hai là chuỗi thay thế. Tham số thứ ba, nếu có sẽ chỉ định status code. Nếu bạn không chỉ định status code, mặc định sẽ là 302(Found), cái mà chỉ ra resource tạm thời được di chuyển hoặc thay thế.

using (StreamReader apacheModRewriteStreamReader = File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader = File.OpenText("IISUrlRewrite.xml")) 
{
    var options = new RewriteOptions()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(d+)/(d+)", "rewritten?var1=$1&var2=$2", skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXMLRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

    app.UseRewriter(options);
}

5.2. URL redirect tới một secure endpoint

Sử dụng AddRedirectToHttps để điều hướng HTTP requests tới cùng host và đường dẫn sử dụng HTTPS(https://). Nếu status code không được cung cấp, middleware mặc định là 302(Found). Nếu port không cung cấp, middleware mặc định là null, có nghĩa là protocol thay đổi tới https:// và client truy cập resource trên port 443. Ví dụ bên dưới chỉ ra làm thế nào để thiết lập status code tới 301 và thay đổi port tới 5001.

var options = new RewriteOptions()
    .AddRedirectToHttps(301, 5001);

app.UseRewriter(options);

5.3. URL rewrite

Sử dụng AddRewrite để tạo một quy tắc cho việc viết lại URLs. Tham số đầu tiên chứa regex của bạn cho việc khớp đường dẫn URl đang đến. Tham số thứ hai là chuỗi thay thế. Tham số thứ 3 skipRemainingRules: {true|false}, chỉ ra cho middleware liệu có hoặc không bỏ qua quy tắc rewrite mở rộng nếu quy tắc hiện tại được áp dụng.

using (StreamReader apacheModRewriteStreamReader = File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader = File.OpenText("IISUrlRewrite.xml")) 
{
    var options = new RewriteOptions()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(d+)/(d+)", "rewritten?var1=$1&var2=$2", skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXMLRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

    app.UseRewriter(options);
}
  • Các bạn có thể tham khảo chi tiết hơn tại bài viết URL Rewriting Middleware in ASP.NET Core
0