我们的旧ASP.net站点将静态图像存储在根目录下的子目录中,名为/images。永久重定向在ASP.Net中静态文件的传统路由MVC
我们新的ASP.net MVC网站/内容的新布局存储这些图片/图片
我已经改变了所有的网页在现场,以应付新的文件夹结构,但我d喜欢从旧静态图像到新位置设置永久重定向。
我们的网站是托管的,我无法控制IIS,那么解决此问题的最佳方法是什么?
我们的旧ASP.net站点将静态图像存储在根目录下的子目录中,名为/images。永久重定向在ASP.Net中静态文件的传统路由MVC
我们新的ASP.net MVC网站/内容的新布局存储这些图片/图片
我已经改变了所有的网页在现场,以应付新的文件夹结构,但我d喜欢从旧静态图像到新位置设置永久重定向。
我们的网站是托管的,我无法控制IIS,那么解决此问题的最佳方法是什么?
我用下面的代码为我的MVC 2网站:
// The legacy route class that exposes a RedirectActionName
public class LegacyRoute : Route
{
public LegacyRoute(string url, string redirectActionName, IRouteHandler routeHandler)
: base(url, routeHandler)
{
RedirectActionName = redirectActionName;
Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index"}); // is not actually called
}
public string RedirectActionName { get; set; }
}
// The legacy route handler, used for getting the HttpHandler for the request
public class LegacyRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.HttpContext.Response.Write("success");
return new LegacyHandler(requestContext);
}
}
// The legacy HttpHandler that handles the request
public class LegacyHandler : MvcHandler
{
public LegacyHandler(RequestContext requestContext) : base(requestContext)
{
requestContext.HttpContext.Response.Write("success");
ProcessRequest(requestContext.HttpContext);
}
protected override void ProcessRequest(HttpContextBase httpContext)
{
string redirectActionName = ((LegacyRoute) RequestContext.RouteData.Route).RedirectActionName;
var route = new Route(redirectActionName, ((LegacyRoute)RequestContext.RouteData.Route).Defaults, new MvcRouteHandler());
// Copy all of the querystring parameters and put them within RouteContext.RouteData.Values
var values = new Dictionary<string, object>();
foreach (var s in RequestContext.RouteData.Values)
{
values.Add(s.Key, s.Value);
}
foreach (var s in httpContext.Request.QueryString.AllKeys)
{
values.Add(s, httpContext.Request.QueryString[s]);
}
var data = route.GetVirtualPath(RequestContext, new RouteValueDictionary(values));
httpContext.Response.Status = "301 Moved Permanently";
httpContext.Response.AppendHeader("Location", "/" + data.VirtualPath + "/");
httpContext.Response.End();
}
}
然后,我只是传统的路由添加到我的路线图:
routes.Insert(13, new LegacyRoute("search", "search/{query}", new LegacyRouteHandler()));
+1您如何使用此代码?你在哪里为LegacyHandler,MVC3创建.cs文件?这将如何工作重定向URL的:〜/ products.aspx?id = 1 – Picflight 2011-02-21 12:38:30
事实证明,我的虚拟主机也让我有控制IIS,因此我能够使用Url重写模块来完成我的要求。但是,如果社区为那些处于我认为自己所处状态的人提供了答案,我将留下此问题。 – 2011-01-18 23:25:51