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 错误。
我有一个包含一组 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 错误。