在我的Asp.Net Mvc項目中,我希望有一個漂亮的網址,例如mysite.com/Page2,我想用我的老式網址(例如mysite.com?page=2)與301狀態重定向,這樣就不會有兩個內容相同的網址。有沒有辦法做到這一點?ASP.NET MVC:從查詢字符串參數重定向到規範網址
據我所知Asp.Net約束力的框架不作查詢字符串和大括號之間的差異PARAMS
在我的Asp.Net Mvc項目中,我希望有一個漂亮的網址,例如mysite.com/Page2,我想用我的老式網址(例如mysite.com?page=2)與301狀態重定向,這樣就不會有兩個內容相同的網址。有沒有辦法做到這一點?ASP.NET MVC:從查詢字符串參數重定向到規範網址
據我所知Asp.Net約束力的框架不作查詢字符串和大括號之間的差異PARAMS
那麼,據我所見,在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 之前您的「文章」路線
我不知道,我收到了你的問題的權利。看來,您當前的設置依賴於這些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重定向。
user492238,改變查詢字符串參數是一個好點,但重定向在母版頁,我認爲是不是很好的MVC項目 – Vladimir 2011-04-15 06:30:59
如果您使用的是IIS 7,則URL Rewrite Module應適用於您的方案。
如何命名真正的ASP.NET頁面? – user492238 2011-04-14 11:22:11
user49223,嗯,我認爲這並不意味着,但這裏是一個例子:/ Article/1022/Ms-Sharepoint-Setup-Manual/Page2。第2頁這裏是分頁顯示本文的評論。在這個時候,這個網址看起來是這樣的:/ Article/1022/Ms-Sharepoint-Setup-Manual?page = 2 – Vladimir 2011-04-14 12:00:19
我不確定這會提供你認爲它會帶來的SEO好處。如果只更改頁面的評論部分,頁面1和頁面2上的內容仍然基本相同。 – 2011-04-15 04:58:51