Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC:从查询字符串参数重定向到规范url_C#_Asp.net Mvc_Redirect - Fatal编程技术网

C# ASP.NET MVC:从查询字符串参数重定向到规范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.NETMVC项目中,我希望有一个好看的URL,例如mysite.com/Page2,我希望从我的老式URL(例如mysite.com?page=2)重定向到301状态,这样就不会有两个内容相同的URL。有办法吗


据我所知,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