2012-12-27 45 views
2

我在我的MVC Web應用程序的Global.asax中下面的代碼:創建過濾器,以確保小寫的網址

/// <summary> 
    /// Handles the BeginRequest event of the Application control. 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> 
    protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     // ensure that all url's are of the lowercase nature for seo 
     string url = Request.Url.ToString(); 
     if (Request.HttpMethod == "GET" && Regex.Match(url, "[A-Z]").Success) 
     { 
      Response.RedirectPermanent(url.ToLower(CultureInfo.CurrentCulture), true); 
     } 
    } 

什麼,這達到是爲了確保所有的URL訪問該網站是小寫。我想遵循MVC模式並將其移至可應用於所有過濾器的全局過濾器。

這是正確的方法嗎?而且我將如何爲上面的代碼創建一個過濾器?

+2

沒有什麼內在的錯誤離開你的代碼在'BeginRequest'方法。但是,要回答您的問題,請執行以下操作:如您所知,將代碼移至過濾器,然後創建(如果尚未擁有),則使用新過濾器修飾(最好是抽象的)BasePageController。這樣你的過濾器將在繼承自你的基礎的控制器類中的所有Action方法上執行。另一種選擇是使用相同的代碼創建一個HttpHandler。這樣做的好處是處理程序在請求生命週期中較早執行,並且應該會產生更好的性能。 – Bryan

+0

可能的重複[如何確保POST上的小寫URL?](http://stackoverflow.com/questions/4349588/how-do-i-ensure-lower-case-urls-on-post) – Toto

回答

1

我的看法 - 一個過濾器來處理全球網址重寫太晚了。但是,爲了回答你的問題是如何創建一個動作過濾器:

public class LowerCaseFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // ensure that all url's are of the lowercase nature for seo 
     var request = filterContext.HttpContext.Request; 
     var url = request.Url.ToString(); 
     if (request.HttpMethod == "GET" && Regex.Match(url, "[A-Z]").Success) 
     { 
      filterContext.Result = new RedirectResult(url.ToLower(CultureInfo.CurrentCulture), true); 
     } 
    } 
} 

和FilterConfig.cs,註冊您的全局過濾:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new LowerCaseFilterAttribute()); 
    } 
} 

無論其,我會推薦了推動這一任務到IIS並使用重寫規則。確保URL Rewrite Module被添加到IIS,然後添加以下重寫規則在你的web.config:

<!-- http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/ --> 
<rule name="Convert to lower case" stopProcessing="true"> 
    <match url=".*[A-Z].*" ignoreCase="false" /> 
    <conditions> 
     <add input="{REQUEST_METHOD}" matchType="Pattern" pattern="GET" ignoreCase="false" /> 
    </conditions> 
    <action type="Redirect" url="{ToLower:{R:0}}" redirectType="Permanent" /> 
</rule>