2011-12-25 33 views
9


tôi đã phát triển một ứng dụng Web trên asp.net MVC3 và bây giờ tôi cần phải thực hiện các tuyến đường, lowercased
Ví dụ:
Định tuyến Url để viết thường là như thế nào?

that's what i have: 
http://www.example.com/SubFolder/Category/Index => looks ugly :-) 

that's how i would like it: 
http://www.example.com/subfolder/category/index 

Tôi đã tìm thấy bài đăng này:
http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/

tôi thực sự cần sử dụng mã bên trong global.asax ở cuối trang.

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    string lowercaseURL = (Request.Url.Scheme + "://" + 
    HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath); 
    if (Regex.IsMatch(lowercaseURL, @"[A-Z]")) 
    { 
     lowercaseURL = lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query; 
     Response.Clear(); 
     Response.Status = "301 Moved Permanently"; 
     Response.AddHeader("Location", lowercaseURL); 
     Response.End(); 
    } 
} 

Bây giờ là câu hỏi:
Khi nào sử dụng nó trên trạm dev đó là công việc của một cách hoàn hảo nhưng khi tôi tải nó lên, để sản xuất nó không làm việc.

On trạm dev nó làm cho chỉ bưu điện, nhưng về sản xuất đó là thực hiện hai:

POST - status: 301 Moved Permanently 
GET - status: 200 OK 

và tôi không được chuyển đến các tuyến đường đúng chút nào. Trên trạm dev nó hoạt động hoàn hảo.

+0

URL ASP.NET không phân biệt chữ hoa chữ thường, toàn bộ điểm chuyển hướng tới URL chữ thường thấp hơn là gì? Bạn đang tạo phí chuyển hướng. Ngoài ra chuyển hướng trên POST sẽ không bao giờ hoạt động chính xác. Tất cả những gì bạn cần làm là thay đổi HTML của bạn để phản ánh URL trường hợp nhỏ hơn. Và không có luật như vậy mà url truyền trên là xấu, không có cơ thể nào nhìn vào nó. Địa điểm duy nhất quan trọng là tại robots.txt có phân biệt chữ hoa chữ thường. –

+0

@PKKG, không, SEO không phân biệt chữ hoa chữ thường, và nếu liên kết giới thiệu có trường hợp khác nhau và chuyển hướng đến trường hợp khác có thể sẽ gây hại cho SEO coi đó là các từ khác nhau. –

+0

@IamStalker: Bạn có thể thêm câu trả lời hoặc gợi ý không? khi bạn chấp nhận câu trả lời. Câu trả lời được chấp nhận sẽ bị xóa ngay bây giờ thật không may – Pankaj

Trả lời

4
protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    string lowercaseURL = (Request.Url.Scheme + 
    "://" + 
    HttpContext.Current.Request.Url.Authority + 
    HttpContext.Current.Request.Url.AbsolutePath); 
    if (Regex.IsMatch(lowercaseURL, @"[A-Z]")) 
    { 
     System.Web.HttpContext.Current.Response.RedirectPermanent 
     (
      lowercaseURL.ToLower() + HttpContext.Current.Request.Url.Query 
     ); 
    } 
} 
+0

+1 và + Tiền thưởng. Vui lòng chấp nhận câu trả lời của riêng bạn. Cảm ơn. – Pankaj

+0

Đây không phải là cách tốt nhất để giải quyết vấn đề này. Tại sao nó trong ứng dụng khi IIS có thể chăm sóc nó cho bạn? – Terry

+0

@Terry: bạn có thể thêm bạn trả lời không? Tôi lại có thể bắt đầu tiền thưởng cho câu trả lời hiện tại. Tin tôi đi !!!! Đang chờ câu trả lời của bạn .... – Pankaj

2

Vì bạn đang sử dụng ASP.NET MVC, tôi không nghĩ rằng Application_BeginRequest là cách để thực hiện. MVC cung cấp nhiều tùy chọn tốt hơn để xử lý các yêu cầu đó.

Nó cũng có thể đạt được bằng cách sử dụng mô-đun IIS Url Rewrite (với cấu hình Web.config), nhưng tôi cho rằng bạn thích cách tiếp cận có lập trình hơn.

Hãy thử với ActionFilter thay vì:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class EnforceLowercaseUrlAttribute : ActionFilterAttribute 
{ 
    private bool _redirect; 

    public EnforceLowercaseUrlAttribute(bool redirect = true) 
    { 
     this._redirect = redirect; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 
     var path = request.Url.AbsolutePath; 
     var containsUpperCase = path.Any(char.IsUpper); 

     if (!containsUpperCase || request.HttpMethod.ToUpper() != "GET") 
      return; 

     if (this._redirect) 
      filterContext.Result = new RedirectResult(path.ToLowerInvariant(), true); 

     filterContext.Result = new HttpNotFoundResult(); 
    } 
} 

Sau đó một trong hai áp dụng nó vào một điều khiển/Hành động:

[EnforceLowercaseUrl] 
public ActionResult Index() 
{ 
    .... 
} 

hoặc đăng ký nó trên toàn cầu trong bạn Global.asax:

GlobalFilters.Filters.Add(new EnforceLowercaseUrlAttribute()); 
+0

lol lý do tại sao bạn sử dụng đúng hai lần? Đó là elogical và cá nhân cho mỗi hành động hoặc một bộ điều khiển. Và quá nhiều mã. – IamStalker

+0

Bởi nhầm lẫn, tôi nghĩ rằng tôi mặc định nó sai. đã sửa. – haim770

+0

Bạn luôn trả về 404. –

0

Sau đây là cách Tôi làm điều đó, tôi tạo một tuyến đường tùy chỉnh. Điều này cũng làm cho những người trợ giúp chẳng hạn như Html.ActionLink cũng tạo các tuyến điều khiển.

tiên tôi kéo dài Route với đối tượng tùy chỉnh (cho phép nói LowerCaseRoute) và ghi đè lên các phương pháp GetVirtualPath như thế này:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
{ 
    var path = base.GetVirtualPath(requestContext, values); 
    if (path != null) 
    { 
     // you could do lots more here, like replacing odd characters with - etc. 
     path.VirtualPath = path.VirtualPath.ToLower(); 
    } 
    return path; 
} 

Sau đó, tôi tạo một helper tùy chỉnh để ánh xạ tuyến đường này như thế này:

public static LowerCaseRoute MapLowerCaseRoute(this RouteCollection routes, string name, string url, object defaults) 
{ 
    var route = new LowerCaseRoute(url, new MvcRouteHandler()); 
    route.Defaults = new RouteValueDictionary(defaults); 
    route.DataTokens = new RouteValueDictionary(); 
    route.DataTokens.Add("RouteName", name); 
    routes.Add(name, route); 
    return route; 
} 

Bằng cách này, bạn có thể tạo tuyến đường trong số global.asax như sau:

RouteTable.Routes.MapLowerCaseRoute("routeName", "baseurl/someother/{param}", { controller = "Controller", param = UrlParameter.Optional }); 

Điều này giúp mọi thứ gọn gàng và rõ ràng bên trong dự án và cung cấp cho bạn nhiều tùy chọn hơn để điều khiển tuyến đường của bạn.

2

Nếu điều này đơn giản chỉ dành cho SEO, giải pháp đơn giản nhất và sử dụng url là viết lại url (giả sử bạn đang lưu trữ trên IIS) hoặc viết lại (nếu bạn đang lưu trữ Apache) để thực thi url trường hợp thấp hơn và để lại bài đăng như chúng.

Với IIS nó đơn giản như cài đặt url viết lại từ trình cài đặt nền tảng web, nhấn thêm quy tắc và chọn "thực thi URL thường". Dễ dàng.

Nếu bạn nâng cấp lên mvc4 và thực sự muốn các bài viết thường, có một thuộc tính LowercaseUrls mà bạn có thể đặt thành true khi bạn đăng ký tuyến. Nhưng một lần nữa - tôi sẽ không bận tâm.

Các vấn đề liên quan