HTML Handler has to be added in web.config which would resolve the issue related to redirecting HTML URLs.
Here is the code snippet which is almost same as the link given in the question.
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>
If the above config handler is not written then when we type https://localhost/sample/page.html then the browser throws 404 error.