在我的Asp.Net Mvc项目中,我希望有一个好看的网址,例如mysite.com/Page2,我想从我的旧样式网址(例如mysite.com?page=2)重定向到301状态,这样就不会有两个内容相同的网址。有办法吗?
据我所知,Asp.Net绑定框架在查询字符串和花括号参数之间没有区别
答案 0 :(得分:0)
我不确定,我的问题是对的。看来,您当前的设置依赖于那些GET参数(如mysite.com?page=2)。如果您不想更改此设置,则必须进一步使用这些参数。不过,这样做没有问题。您的用户不必使用或查看它们。要仅发布“新样式网址”,您可以在网络服务器中设置网址重定向。这会将新样式的URL更改为旧样式的URL。
问题是301.如果用户请求旧样式URL,它也将被Web服务器接受。拒绝请求301错误似乎很难实现。
为了解决这个问题,我想你必须改变你的参数方案。您的网站可能仍然依赖于GET参数 - 但它们会获得一个新名称。可以说,您的评论是针对旧方案中的以下(内部)URL而发布的:
/Article/1022/Ms-Sharepoint-Setup-Manual?newpage=2
请注意新参数名称。在根页面(或母版页,如果您正在使用它们),您可以手动处理重定向永久(301)。因此,通过使用旧参数名称可以区分传入的“旧样式请求”。这可以用于在ASP代码中手动组装301中的响应。
就个人而言,我会说,放弃301的想法,只使用URL重定向。
答案 1 :(得分: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状态的网址。然后,您必须将此路线添加到global.asax 之前您的“文章”路线
答案 2 :(得分:0)
如果您使用的是IIS 7,则URL Rewrite Module应适用于您的方案。