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 パターンに従い、これをすべてのフィルターにグローバルに適用できるフィルターに移動したいと思います。

これは正しいアプローチですか?上記のコードのフィルターを作成するにはどうすればよいですか?

4

1 に答える 1

1

私の意見 - グローバルな URL の書き換えを処理するにはフィルターが遅すぎます。ただし、アクション フィルターを作成する方法についての質問に答えるには、次のようにします。

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 書き換えモジュールが 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>
于 2013-01-05T05:07:48.190 に答える