Trung tâm hỗ trợ

Một số vấn đề phổ biến khi viết lại (Rewrite) URL trong ASP.Net

Tóm tắt: Việc viết lại (Rewrite) URL mang lại nhiều lợi ích như cung cấp các liên kết rõ ràng về nội dung, giúp Website dễ dàng được tìm kiếm, che giấu File cùng đường dẫn thực trên Server. 

Tuy nhiên, đối với người mới bắt đầu, công việc này không phải lúc nào cũng dễ dàng. Sau một thời gian tìm hiểu một số lỗi thường gặp khi rewrite url trong ASP.Net, tôi xin chia sẻ một số lỗi phổ biến mà bạn có thể gặp phải như: Mất liên kết tới các File hình ảnh, CSS, JavaScript, lỗi khi Postback,... và cách khắc phục chúng.


Tôi hy vọng bài viết này sẽ phần nào giải đáp được những thắc mắc của các bạn yêu lập trình ASP.Net C#. Đây là quan điểm cá nhân của tôi và cách tôi sử dụng, bạn cũng có thể tìm cho mình những cách tối ưu khác!


Khi bạn đến với Website: http://lichsu.vn , có thể bạn đã tìm hiểu rất nhiều thông tin trên các công cụ tìm kiếm và các Website về lập trình, nhưng vẫn chưa có câu trả lời thỏa đáng.


Các vấn đề thường gặp bao gồm:

1. Cách viết lại URL trong ASP.Net C# sử dụng UrlRewriting.Net

2. Hiển thị các Querystring với những ID không thân thiện thành đoạn văn bản thân thiện

3. Mất liên kết tới các File hình ảnh, CSS, JavaScript khi viết lại URL

4. URL trở về dạng thực khi trang có Postback

5. Phân trang sử dụng CollectionPager trong các trang đã được viết lại URL

6. Lỗi khi Upload lên Hosting


Cách viết lại URL trong ASP.Net C# sử dụng UrlRewriting.Net

UrlRewriting.Net là một thành phần mã nguồn mở rất dễ sử dụng và đáng tin cậy để viết lại URL trong ASP.Net. Thành phần này được thiết kế và phát triển vào năm 2006 và hoạt động trên nền ASP.Net 2.0, tuy nhiên nó vẫn hoạt động tốt trên nền ASP.Net 3.5.


Yêu cầu: Chỉ cần 1 Webserver ASP.Net, ví dụ IIS (các phiên bản từ 5.0 đến 7.0).


Cách sử dụng:

- Nhấn chuột phải vào Website của bạn (trên VS 2005 hoặc 2008), sau đó chọn Add Reference – trong hộp thoại hiện ra chọn TAB Browse và trỏ tới File dll vừa Download về.

- Đặt các quy tắc (Rule) trong hàm Application_BeginRequest trong File Global.asax; do đó, bạn cũng cần thêm File Global.asax vào Project của mình.


Giả sử bây giờ Project của chúng ta là một Website bán hàng, có Categories (nhóm sản phẩm) và Products (sản phẩm), việc phân tích cơ sở dữ liệu thế nào sẽ không được bàn tới trong bài viết này.


Đường dẫn thực tế:

Danh sách các sản phẩm trong nhóm có ID = 1: http://lichsu.vn/Categories.aspx?catid=1

Chi tiết sản phẩm có ID = 100 và CatID = 1: http://lichsu.vn/Products.aspx?catid=1&id=100


Mục tiêu viết lại URL:

Bạn muốn chuyển các URL trên thành dạng thân thiện hơn như sau:

1. http://lichsu.vn/1/Thoi-trang.html

2. http://lichsu.vn/1/100/Quan-jean-ninomaxx.html

Đây chỉ là ví dụ, bạn có thể thay đổi theo sở thích cá nhân của mình. Để thực hiện việc này, trước tiên bạn cần hiểu rằng Webserver, sau khi nhận được Request từ các liên kết đã được viết lại, sẽ dựa vào các quy tắc (Rule) mà bạn đã thiết lập trong phương thức Application_BeginRequest của File Global.asax.


Ví dụ cho hai trường hợp trên:

void Application_BeginRequest(object sender, EventArgs e)

 

{

 

//Khoi tao rule

 

UrlRewritingNet.Web.RegExRewriteRule ruleCategory = newUrlRewritingNet.Web.RegExRewriteRule();

 

UrlRewritingNet.Web.RegExRewriteRule ruleProduct = newUrlRewritingNet.Web.RegExRewriteRule();

 

//Rule – rewrite cho Products

 

ruleProduct.VirtualUrl = "^~/(.*)/(.*)/(.*).html";

 

ruleProduct.DestinationUrl = "~/Products.aspx?catid=$1&id=$2";

 

ruleProduct.IgnoreCase = true;

 

ruleProduct.Rewrite = UrlRewritingNet.Web.RewriteOption.Application;

 

ruleProduct.Redirect = UrlRewritingNet.Web.RedirectOption.None;

 

ruleProduct.RewriteUrlParameter = UrlRewritingNet.Web.RewriteUrlParameterOption.ExcludeFromClientQueryString;

 

UrlRewritingNet.Web.UrlRewriting.AddRewriteRule("Product_Rule", ruleProduct);

 

//Rule – rewrite cho Categories

 

ruleCategory.VirtualUrl = "^~/(.*)/(.*).html"; //1-CatID, 2-CatName

 

ruleCategory.DestinationUrl = "~/Categories.aspx?catid=$";

 

ruleCategory.IgnoreCase = true;

 

ruleCategory.Rewrite = UrlRewritingNet.Web.RewriteOption.Application;

 

ruleCategory.Redirect = UrlRewritingNet.Web.RedirectOption.None;

 

ruleCategory.RewriteUrlParameter = UrlRewritingNet.Web.RewriteUrlParameterOption.ExcludeFromClientQueryString;

 

UrlRewritingNet.Web.UrlRewriting.AddRewriteRule("Category_Rule", ruleCategory);

 

}

 

Ở đây, các bạn hãy bỏ qua các khai báo và các khởi tạo, quan tâm đến 4 dòng lệnh sau:

 

//Mã để rewrite http://lichsu.vn/1/100/Quan-jean-ninomaxx.html

 

ruleProduct.VirtualUrl = "^~/(.*)/(.*)/(.*).html";

 

//1-CatID, 2-ProductID, 3-ProductName

 

ruleProduct.DestinationUrl = "~/Products.aspx?catid=$1&id=$2";


Ý nghĩa của các dòng lệnh trên có thể diễn giải như sau:

Khi gặp một URL có dạng /abc/xyz/jqk.html mà trước đó là thư mục gốc, thực tế sẽ chạy URL Products.aspx?catid=abc&id=xyz (vì theo khai báo trong DestinationUrl, Catid nhận giá trị từ tham số thứ nhất, và ID của sản phẩm nhận giá trị từ tham số thứ hai. 

Tương tự, chúng ta cũng có thể hiểu điều này đối với các dòng lệnh sau:


Mã để viết lại URL: http://lichsu.vn/1/Thoi-trang.html

 

ruleCategory.VirtualUrl = "^~/(.*)/(.*).html"; //1-CatID, 2-CatName

ruleCategory.DestinationUrl = "~/Categories.aspx?catid=$1";


Nếu bạn thực hiện đúng theo các hướng dẫn trên, bây giờ bạn có thể thử nhập vào thanh địa chỉ trình duyệt http://localhost:xxxx/1/Thoi-trang.html bạn sẽ thấy nội dung của trang http://localhost:xxxx/Categories.aspx?id=1 hiện lên (nếu đúng như vậy, bạn đã đi được 1/6 quãng đường rồi).


Một số lưu ý nhỏ khi viết các quy tắc trong Global.asax:

- Đặt các khối lệnh mà Rule có nhiều Parameter lên phía trước: 

Nguyên nhân là nếu đặt khối lệnh có ít Parameter lên trước, khi gặp đường dẫn có nhiều Parameter nhưng vẫn thỏa mãn Rule ít Parameter, nó sẽ chạy sai trang và gây ra lỗi. 

Ví dụ, tôi đã đặt Rule viết lại URL cho sản phẩm lên trước.

- Đối với các Rule có cùng số lượng Parameter: 

Hãy cố gắng truyền thêm một Parameter vào một Rule nào đó (dù Parameter đó không được sử dụng). Nếu vẫn bằng với một Rule khác, hãy sử dụng Regular Expression để phân biệt hoặc sử dụng các điều kiện if-else mà bạn có thể áp dụng. 

 

Nguồn: Thiết kế Website

Hơn +10,000 doanh nghiệp và chủ shop đang bán hàng như thế nào ?
Bạn mong muốn có một website thương hiệu phù hợp với lĩnh vực hoạt động doanh nghiệp. Hãy liên hệ với chúng tôi, mọi mong muốn của bạn sẽ được lắng nghe.Chúng tôi mong muốn nhận thông tin yêu cầu của quý khách hàng qua đường dây nóng 0938 91 96 05 để chúng tôi có thể tư vấn một cách tốt nhất.
IMS luôn sẵn sàng phục vụ quý khách hàng 24/7, mọi thắc mắc xin hãy gọi điện với chúng tôi qua số hotline 0938 91 96 05 để được tư vấn trực tiếp Liên hệ báo giá