2011-04-14 49 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

相關問題