C# ASP.NET MVC:从查询字符串参数重定向到规范url
在我的Asp.NETMVC项目中,我希望有一个好看的URL,例如mysite.com/Page2,我希望从我的老式URL(例如mysite.com?page=2)重定向到301状态,这样就不会有两个内容相同的URL。有办法吗C# ASP.NET MVC:从查询字符串参数重定向到规范url,c#,asp.net-mvc,redirect,C#,Asp.net Mvc,Redirect,在我的Asp.NETMVC项目中,我希望有一个好看的URL,例如mysite.com/Page2,我希望从我的老式URL(例如mysite.com?page=2)重定向到301状态,这样就不会有两个内容相同的URL。有办法吗 据我所知,Asp.Net绑定框架对查询字符串和大括号参数没有任何区别,我不确定,我没有弄错你的问题。看起来,您当前的设置依赖于这些GET参数(比如mysite.com?page=2)。如果不想更改此参数,则必须进一步使用这些参数。不过,这样做没有问题。您的用户不必使用或查看
据我所知,Asp.Net绑定框架对查询字符串和大括号参数没有任何区别,我不确定,我没有弄错你的问题。看起来,您当前的设置依赖于这些GET参数(比如mysite.com?page=2)。如果不想更改此参数,则必须进一步使用这些参数。不过,这样做没有问题。您的用户不必使用或查看它们。为了仅发布“新样式URL”,您可以在web服务器中设置URL重定向。这会将新样式的URL更改为旧样式的URL 问题是301。如果用户请求一个旧式URL,Web服务器也会接受它。以301错误拒绝请求对我来说似乎很难实现 为了解决这个问题,我想你必须改变你的参数方案。您的站点可能仍然依赖GET参数,但它们会得到一个新名称。比如说,您的评论在旧方案中针对以下(内部)URL进行了适当的传递:
/Article/1022/Ms-Sharepoint-Setup-Manual?newpage=2
请注意新的参数名。在根页面(或母版页,如果您正在使用这些页面),您可以手动处理重定向永久(301)。因此,传入的“旧式请求”可以通过使用旧参数名来区分。这可用于在ASP代码的响应中手动组装301
就个人而言,我建议,放弃301的想法,只使用URL重定向 我不确定,你的问题我答对了。看起来,您当前的设置依赖于这些GET参数(比如mysite.com?page=2)。如果不想更改此参数,则必须进一步使用这些参数。不过,这样做没有问题。您的用户不必使用或查看它们。为了仅发布“新样式URL”,您可以在web服务器中设置URL重定向。这会将新样式的URL更改为旧样式的URL 问题是301。如果用户请求一个旧式URL,Web服务器也会接受它。以301错误拒绝请求对我来说似乎很难实现 为了解决这个问题,我想你必须改变你的参数方案。您的站点可能仍然依赖GET参数,但它们会得到一个新名称。比如说,您的评论在旧方案中针对以下(内部)URL进行了适当的传递:
/Article/1022/Ms-Sharepoint-Setup-Manual?newpage=2
请注意新的参数名。在根页面(或母版页,如果您正在使用这些页面),您可以手动处理重定向永久(301)。因此,传入的“旧式请求”可以通过使用旧参数名来区分。这可用于在ASP代码的响应中手动组装301
就个人而言,我建议,放弃301的想法,只使用URL重定向 嗯,就我所知,在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 });
}
}
假设您在my global.asax文件(上面列出)中有这样的路由,您可以创建一个自定义的
Route
类,该类将处理传入请求,并将它们映射到一个特殊的重定向控制器上,该控制器随后将它们重定向到具有301状态的适当URL。然后,您必须在您的“文章”路由之前将此路由添加到global.asax,就我所知,在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 });
}
}
假设您在my global.asax文件(上面列出)中有这样的路由,您可以创建一个自定义的
Route
类,该类将处理传入请求,并将它们映射到一个特殊的重定向控制器上,该控制器随后将它们重定向到具有301状态的适当URL。然后,您必须在“文章”路由之前将此路由添加到global.asax,如果您使用的是IIS 7,则该路由应适用于您的场景。如果您使用的是IIS 7,则该路由应适用于您的场景。真正的ASP.NET页面名称是什么?user49223,我认为没有意义,但这里有一个例子:/Article/1022/Ms Sharepoint安装手册/Page2。Page2这里是显示本文评论的页面。目前,此url看起来是这样的:/Article/1022/Ms Sharepoint安装手册?page=2我不确定这是否会提供您认为会带来的SEO好处。Page1和Page2如果只改变页面的评论部分,仍然会有大致相同的内容。Chris Sainty,是的,在这个特定的例子中,这不会提供任何可见的SEO利润,我写它是因为它的简单性。我同意您可能不想只为了好看的寻呼而更改路由系统。但是如果你有一个像mysite.com/Articles?category=Sharepoint
这样的url,你会想把它改成mysite.com/Articles/Sharepoint
,问题是如何做,真正的ASP.NET页面名为?user49223,我认为没有意义,但这里有一个例子:/Article/1022/Ms Sharepoint Setup Manual/Page2。Page2这里是显示本文评论的页面。目前,此url看起来是这样的:/Article/1022/Ms Sharepoint安装手册?page=2我不确定这是否会提供您认为会带来的SEO好处。Page1和Page2如果只改变页面的评论部分,仍然会有大致相同的内容。Chris Sainty,是的,在这个特定的例子中,这不会提供任何可见的SEO利润,我写它是因为它的简单性。我同意您可能不想只为了好看的寻呼而更改路由系统。但是如果你有一个像mysite.com/Articles?category=Sharepoin这样的url