在我的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