ASP.NET MVC 将旧 URL 重定向到新 URL

ASP.NET MVC Redirect Old URL to New URL

我有一个包含一组 html 文件的网站,现在我正在迁移到 MVC 应用程序。我尝试使用博客中提到的代码

http://www.bloggersworld.com/index.php/redirecting-old-urls-to-new-in-aspnet-mvc/

用于将旧的 URL 重定向到新的 MVC 但出现 404 错误。

这里是 RouteConfig.cs 代码

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.Add(new LegacyUrlRoute());

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

我创建了一个类似于博客中提到的 class 并设置了提到的重定向。

来自 LegacyUrlRoute 的示例代码

new RedirectRule ("oldpage.html", "", "/department/letter/july")

这里department是我的controller,letter是action,july是ID。

如果我直接在 URL 中给出这个 /department/letter/july 就可以了。

我注意到问题出在 URL 中的 .html 而不是 .aspx。

如果我给 URL 作为 localhost/oldpage.aspx 那么它工作正常但是如果我给 localhost/oldpage.html 它去 404

能请教一下吗?

HTML 必须在 web.config 中添加处理程序,这将解决与重定向 HTML URL 相关的问题。

这是与问题中给出的 link 几乎相同的代码片段。

RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.Add(new LegacyUrlRoute());

        routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

    }
}

LegacyUrlRoute class:

      public class RedirectRule
        {
            public string OldUrlContains;
            public string OldUrlContainsNot;
            public string NewUrl;

            public RedirectRule(string strOldUrlContains, string 
 strOldUrlContainsNot, string strNewUrl)
            {
                OldUrlContains = strOldUrlContains;
                OldUrlContainsNot = strOldUrlContainsNot;
                NewUrl = strNewUrl;
            }
        }


    public class LegacyUrlRoute : RouteBase
    {
        RedirectRule[] RedirectRules =
        {
            new RedirectRule("oldhtmlurlvalue", "", "/controller/action"),
        };


        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            const string status = "301 Moved Permanently";
            var request = httpContext.Request;
            var response = httpContext.Response;
            var legacyUrl = request.Url.ToString();
            var newUrl = "";

            foreach (RedirectRule rule in RedirectRules)
            {
                //if we don't have to check for a string that does not exist in the url
                if (rule.OldUrlContainsNot.Length == 0)
                {

                    //this does a case insensitive comparison
                    if (legacyUrl.IndexOf(rule.OldUrlContains, 0, StringComparison.CurrentCultureIgnoreCase) >= 0)
                    {
                        newUrl = rule.NewUrl;
                    }
                }
                else
                {
                    //if we don't have to check for a string that does not exist in the url
                    if ((legacyUrl.IndexOf(rule.OldUrlContains, 0, StringComparison.CurrentCultureIgnoreCase) >= 0)
                        //so that it doesn't go in infinite loop since the end part of both urls are same
                        && (!(legacyUrl.IndexOf(rule.OldUrlContainsNot, 0, StringComparison.CurrentCultureIgnoreCase) >= 0)))
                    {
                        newUrl = rule.NewUrl;
                    }
                }

                //found anything?
                if (newUrl.Length > 0)
                {
                    break;
                }

            }


            if (newUrl.Length > 0)
            {
                response.Status = status;
                response.RedirectLocation = newUrl;
                response.End();
            }

            return null;
        }

        public override VirtualPathData GetVirtualPath(RequestContext requestContext,
                    RouteValueDictionary values)
        {
            return null;
        }
    }

Web.Config

<system.webServer>
   <handlers>
      <add name="HtmlScriptHandler" path="*.html" verb="*"
         preCondition="integratedMode" type="System.Web.StaticFileHandler" />
    </handlers>
  </system.webServer>

如果上面的配置处理程序没有写,那么当我们输入 https://localhost/sample/page.html 时,浏览器会抛出 404 错误。