Một số lỗi thường gặp khi rewrite url trong ASP.Net (sử dụng UrlRewritingNet)

Tóm tắt: Rewrite url rõ rang là có rất nhiều tiện lợi, các liên kết được thể hiện rõ ràng về mặt nội dung, giúp cho website của bạn dễ được tìm kiếm, hay giấu file và đường dẫn thực trên server của bạn. Tuy nhiên công việc đó không phải lúc nào cũng đơn giản đối với những bạn mới bắt đầu. Qua một thời gian tìm hiểu, tôi xin nêu ra một số lỗi mà các bạn thường gặp như: mất liên kết các file hình ảnh, css, javascript, lỗi khi postback,… phải và cách giải quyết.
 
 
 
Một số lỗi thường gặp khi rewrite url trong ASP.Net (sử dụng UrlRewritingNet)
 
Rewrite url rõ rang là có rất nhiều tiện lợi, các liên kết được thể hiện rõ ràng về mặt nội dung, giúp cho website của bạn dễ được tìm kiếm, hay giấu file và đường dẫn thực trên server của bạn. Tuy nhiên công việc đó không phải lúc nào cũng đơn giản đối với những bạn mới bắt đầu. Qua một thời gian tìm hiểu, tôi xin nêu ra một số lỗi mà các bạn thường gặp như: mất liên kết các file hình ảnh, css, javascript, lỗi khi postback,… phải và cách giải quyết.
 
Chào các bạn!
 
Tôi hy vọng bài viết sau đây, sẽ giải quyết được phần nào những thắc mắc của các bạn yêu lập trình Asp.net C#. Bài viết này chỉ là quan điểm của cá nhân tôi, cách mà tôi sử dụng, ngoài ra bạn có thể tự tìm cho mình những cách tối ưu hơn!
 
Khi bạn đến với website http://lichsu.vn chắc chắn các bạn đã tìm hiểu rất nhiều trên các công cụ tìm kiếm, trên những website về lập trình, nhưng có lẽ vẫn chưa có những câu trả lời thỏa mãn cho các bạn.
 
Tôi xin nếu ra các vấn đề bạn thường gặp như sau:
 
1) Cách rewrite url trong asp.net C# sử dụng UrlRewriting.Net như thế nào?
 
2) Hiển thị các querytring với những ID khô khan thành đoạn text thân thiện.
 
3) Vấn đề mất các liên kết hình ảnh, css, javascript khi rewrite url.
 
4) Vấn đề khi trang có postback thì url lại quay về url thực.
 
5) Vấn đề phân trang có sử dụng CollectionPager trong các trang đã được rewrite.
 
6) Gặp lỗi khi upload lên hosting.
 
 
 
Bài thứ 1: Cách rewrite url trong asp.net C# sử dụng UrlRewriting.Net như thế nào?
 
UrlRewriting.Net là một Open Source Component rất dễ dàng và đáng tin cậy để viết lại Url với ASP.Net. Component này được thiết kế và phát triển vào năm 2006 và chạy trên nền ASP.Net 2.0, tuy nhiên nó vẫn chạy tốt trên nền ASP.Net 3.5.
 
Yêu cầu chỉ cần một webserver ASP.Net, ví dụ IIS (các phiên bản từ 5.0 đến 7.0)
 
Cách sử dụng: Download file dll UrlRewritingNet.dll tại đây. Sau đó kích chuột phải vào website của bạn (trên VS 2005 hoặc 2008), chọn Add Reference – trong hộp thoại hiện ra bạn chọn TAB Browse và trỏ đến file dll vừa download về.

Lich su Viet Nam

Tiếp theo là bạn cần cấu hình trong file Web.config như sau:
 
- Thêm đoạn sau vào bên trong cặp thẻ đóng mở configSections
 
<configSections>
 
<section name="urlrewritingnet" requirePermission="false" type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter" />
 
</configSections>
 
- Thêm vào trong cặp thẻ đóng mở httpModules
 
<httpModules>
 
<clear/>
 
<add name="UrlRewriteModule"type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
 
</httpModules>
 
 
 
Như vậy là bạn đã cấu hình xong để có thể bắt đầu sử dụng UrlRewritingNet.
 
Cách của tôi là đặt ra các quy tắc (rule), trong hàm Application_BeginRequest trong file Global.asax, cho nên các bạn cũng phải add thêm file Global.asax vào trong project của mình.
 
Bây giờ giả sử 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, tôi sẽ không bàn tới trong bài viết này.
 
Đường dẫn thực:
 
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
 
Bạn muốn viết lại thành
 
 
 
Đây là tôi ví dụ như vậy, còn tùy theo sở thích mà các bạn rewrite theo ý của mình. Để làm được như vậy trước hết các bạn phải hiểu, webserver sau khi nhận được request từ đường link (đã được rewrite), sẽ dựa vào những rule mà bạn đặt ra trong phương thức Application_BeginRequest (Global.asax)
 
Ví dụ với 02 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&amp;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, các khởi tạo, mà hay quan tâm đến 4 dòng lệnh sau:
 
 
 
 
ruleProduct.VirtualUrl = "^~/(.*)/(.*)/(.*).html";
 
//1-CatID, 2-ProductID, 3-ProductName
 
ruleProduct.DestinationUrl = "~/Products.aspx?catid=$1&amp;id=$2";
 
Ý nghĩa của 2 dòng lệnh trên có thể diễn giải một cách nôm na như sau:
 
Khi gặp một url có dạng /abc/xyz/jqk.html mà trước nó là root folder thì thực tế sẽ chạy url Products.aspx?catid=abc&id=xyz(vì theo khai báo ở DestinationUrl thì catid sẽ nhận giá trị tại parameter 1, và id của sản phẩm sẽ nhận parameter ở vị trí thứ 2). Tương tự ta cũng có thể hiểu được đối với 2 dòng lệnh sau:
 
//Mã để rewrite http://lichsu.vn/1/Thoi-trang.html
 
ruleCategory.VirtualUrl = "^~/(.*)/(.*).html"; //1-CatID, 2-CatName
 
ruleCategory.DestinationUrl = "~/Categories.aspx?catid=$1";
 
Nếu như các bạn làm đúng theo các hướng dẫn của tôi như trên, bây giờ các bạn có thể thử gõ trên thanh địa chỉ trình duyệt thttp://localhost:xxxx/1/Thoi-trang.html bạn sẽ thấy hiện lên nội dung của trang http://localhost:xxxx/Categories.aspx?id=1 (nếu thấy hiện ra đúng, như vậy các bạn đã đi được 1/6 quãng đường rồi :D).
 
Một chú ý nho nhỏ cho các bạn khi viết các quy tắc trong Global.asax
 
- Đặt các khối lệnh mà trong đó rule có nhiều parameter lên phía trước, nguyên nhân, nếu đặt khối ít lên trước, thì gặp đường dẫn có nhiều parameter nhưng vẫn thỏa mãn rule ít parameter, thì nó sẽ chạy sai trang à sinh ra lỗi. Ví dụ trên tôi đã đặt rule để rewrite product lên trước.
 
- Đối với các rule có số parameter bằng nhau (mỗi thằng 2, hoặc mỗi thằng 3), cố gắng truyền thêm một parameter vào một rule nào đó (mặc dù parameter đó sẽ không dùng đến). Nếu tiếp tục bằng với một rule khác, hãy sử dụng Regular Expression để phân biệt, hoặc các điều kiện if-else nào đó mà bạn có thể sử dụng được. Trong bài này, tôi không pro RegEx lắm nên không thể hướng dẫn các bạn được (trước có học, nhưng bây giờ thì quên gần hết).
Gửi yêu cầu hỗ trợ


Top