这是我的默认路线:
routes.MapRouteLowercase(
"Default",
"{country}/{controller}/{action}/{id}",
new {
country = "uk",
controller = "Home",
action = "Index",
id = UrlParameter.Optional
},
new[] { "Presentation.Controllers" }
);
众所周知,当有人访问www.domain.com/时,MVC的路由将根据上述路由确定默认控制器和要执行的操作,但URL将保持不变。对于使用默认值的每条路线,是否有内置或优雅的方式从www.domain.com/执行301重定向到www.domain.com/uk/{controller}/{action}/?
答案 0 :(得分:14)
我创建了一个自定义路由处理程序,它在路由级别执行重定向。感谢Phil Haack。
这是完整的工作。
重定向路由处理程序
public class RedirectRouteHandler : IRouteHandler
{
private string _redirectUrl;
public RedirectRouteHandler(string redirectUrl)
{
_redirectUrl = redirectUrl;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
if (_redirectUrl.StartsWith("~/"))
{
string virtualPath = _redirectUrl.Substring(2);
Route route = new Route(virtualPath, null);
var vpd = route.GetVirtualPath(requestContext,
requestContext.RouteData.Values);
if (vpd != null)
{
_redirectUrl = "~/" + vpd.VirtualPath;
}
}
return new RedirectHandler(_redirectUrl, false);
}
}
重定向http处理程序
public class RedirectHandler : IHttpHandler
{
private readonly string _redirectUrl;
public RedirectHandler(string redirectUrl, bool isReusable)
{
_redirectUrl = redirectUrl;
IsReusable = isReusable;
}
public bool IsReusable { get; private set; }
public void ProcessRequest(HttpContext context)
{
context.Response.Status = "301 Moved Permanently";
context.Response.StatusCode = 301;
context.Response.AddHeader("Location", _redirectUrl);
}
}
路线扩展
public static class RouteExtensions
{
public static void Redirect(this RouteCollection routes, string url, string redirectUrl)
{
routes.Add(new Route(url, new RedirectRouteHandler(redirectUrl)));
}
}
拥有所有这些,我可以在Global.asax.cs中映射路径时执行类似的操作。
routes.Redirect("", "/uk/Home/Index");
routes.Redirect("uk", "/uk/Home/Index");
routes.Redirect("uk/Home", "/uk/Home/Index");
.. other routes
答案 1 :(得分:6)
在我的项目中,我通常将“IndexRedirect”作为我的路径中的默认操作(其URL将永远不可见),除了重定向到“真实”索引页面(其URL始终可见)之外什么都不做。
您可以在所有控制器类的基类中创建此操作。