ASP.NET MVC:从查询字符串参数重定向到规范网址

时间:2011-04-14 11:11:04

标签: c# asp.net-mvc redirect

在我的Asp.Net Mvc项目中,我希望有一个好看的网址,例如mysite.com/Page2,我想从我的旧样式网址(例如mysite.com?page=2)重定向到301状态,这样就不会有两个内容相同的网址。有办法吗?

据我所知,Asp.Net绑定框架在查询字符串和花括号参数之间没有区别

3 个答案:

答案 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应适用于您的方案。