2011-04-14 48 views
1

在我的Asp.Net Mvc项目中,我希望有一个漂亮的网址,例如mysite.com/Page2,我想用我的老式网址(例如mysite.com?page=2)与301状态重定向,这样就不会有两个内容相同的网址。有没有办法做到这一点?ASP.NET MVC:从查询字符串参数重定向到规范网址

据我所知Asp.Net约束力的框架不作查询字符串和大括号之间的差异PARAMS

+0

如何命名真正的ASP.NET页面? – user492238 2011-04-14 11:22:11

+0

user49223,嗯,我认为这并不意味着,但这里是一个例子:/ Article/1022/Ms-Sharepoint-Setup-Manual/Page2。第2页这里是分页显示本文的评论。在这个时候,这个网址看起来是这样的:/ Article/1022/Ms-Sharepoint-Setup-Manual?page = 2 – Vladimir 2011-04-14 12:00:19

+0

我不确定这会提供你认为它会带来的SEO好处。如果只更改页面的评论部分,页面1和页面2上的内容仍然基本相同。 – 2011-04-15 04:58:51

回答

0

那么,据我所见,在ASP.NET MVC中执行这样的重定向可能会很棘手。这是我做的:

的Global.asax:

 routes.Add(new QueryStringRoute()); 

     routes.MapRoute(null, "Article/{id}/{name}", 
      new { controller = "Article", action = "View", page = 1 }, 
      new { page = @"\d+" } 
     ); 

     routes.MapRoute(null, "Article/{id}/{name}/Page{page}", 
      new { controller = "Article", action = "View" }, 
      new { page = @"\d+" } 
     ); 

QueryStringRoute.cs:

public class QueryStringRoute : RouteBase 
{ 
    private static string[] queryStringUrls = new string[] 
    { 
     @"~/Article/\d{1,6}/.*?page=\d{1,3}" 
    }; 


    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     string url = httpContext.Request.AppRelativeCurrentExecutionFilePath; 

     foreach (string queryStringUrl in queryStringUrls) 
     { 
      Regex regex = new Regex(queryStringUrl); 
      if (regex.IsMatch(url)) 
      { 
       long id = 0; /* Parse the value from regex match */ 
       int page = 0; /* Parse the value from regex match */ 
       string name = ""; /* Parse the value from regex match */ 

       RouteData rd = new RouteData(this, new MvcRouteHandler()); 

       rd.Values.Add("controller", "QueryStringUrl"); 
       rd.Values.Add("action", "Redirect"); 
       rd.Values.Add("id", id); 
       rd.Values.Add("page", page); 
       rd.Values.Add("name", name); 
       rd.Values.Add("controllerToRedirect", "Article"); 
       rd.Values.Add("actionToRedirect", "View"); 

       return rd; 
      } 
     } 

     return null; 
    } 


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

QueryStringUrlController.cs:

public class QueryStringUrlController : Controller 
{ 
    public RedirectToRouteResult Redirect(long id, int page, string name, 
     string controllerToRedirect, string actionToRedirect) 
    { 
     return RedirectToActionPermanent(actionToRedirect, controllerToRedirect, new { id = id, page = page, name = name }); 
    } 
} 

假设你有这样的路由在我的global.asax文件(上面列出)中,您可以创建一个自定义Route类,它将处理请求并将它们映射到一个特殊的重定向控制器上,该控制器会将它们重定向到301状态的相应URL。然后,您必须将此路线添加到global.asax 之前您的“文章”路线

0

我不知道,我收到了你的问题的权利。看来,您当前的设置依赖于这些GET参数(如mysite.com?page=2)。如果你不想改变这个,你将不得不进一步使用这些参数。不过,这样做不会有问题。您的用户不必使用或看到它们。为了仅发布“新样式的URL”,您可以在您的Web服务器中设置URL重定向。这会将新的样式网址更改为旧式的网址。

问题是301.如果用户请求旧样式的URL,它也会被网络服务器接受。拒绝301错误的请求似乎很难实现。

为了解决这个问题,我想你将不得不改变你的参数方案。您的网站可能仍然依赖GET参数 - 但它们会得到一个新名称。比方说,你的意见是在旧方案交付属性格式以下(内)网址:

/Article/1022/Ms-Sharepoint-Setup-Manual?newpage=2 

注意新的参数名称。在您的根页面(或母版页,如果您正在使用这些页面),您可以手动处理重定向永久(301)。因此,通过使用旧的参数名称可以区分传入的“旧式请求”。这可以用来在ASP代码中的响应中手动组装301。

就个人而言,我会告诉你,放弃301的想法,只使用URL重定向。

+0

user492238,改变查询字符串参数是一个好点,但重定向在母版页,我认为是不是很好的MVC项目 – Vladimir 2011-04-15 06:30:59

相关问题