【问题标题】:RedirectToRoute is double-encoding the "/" in parameters that are URLs in the routeValuesRedirectToRoute 对 routeValues 中的 URL 参数中的“/”进行双重编码
【发布时间】:2011-11-11 06:10:43
【问题描述】:

我有一个编码问题,我似乎无法处理有关路线上的参数的问题。基本上,它要么 从不 URL 编码,要么 double URL 编码。我只想要单编码!

这是我注册的路线:

routes.MapRoute("Scan", "Scan/{*url}", new { controller = "Scan", action = "Index" });

现在我有一个重定向到该路由的控制器操作。为简单起见,假设它看起来像这样:

var url = "troyhunt.com/search";
return RedirectToRoute("Scan", new { url });

生成的 URL 是“Scan/troyhunt.com/search” - 请注意 .com 之后的正斜杠没有被转义。

现在让我们再试一次,但应用 URL 编码:

var url = HttpUtility.UrlEncode("troyhunt.com/search");
return RedirectToRoute("Scan", new { url });

这次生成的 URL 是“Scan/troyhunt.com%252fsearch” - 请注意正斜杠已被双重编码。如果我在重定向之前设置断点,我可以看到 UrlEncode 方法成功地将正斜杠编码为 %2f。

似乎重定向正在编码“%”符号而不是“/”。如果我使用通常使用 URL 编码 (?,=) 转义的其他字符进行测试,则编码可以直接从 RedirectToRoute 方法正常工作。将斜线视为分隔路线段因此不会逃逸,这可能是一个问题吗?我在这里错过了什么吗?

更新:To route or not to route, that is the question 中讨论了更多信息、评论和解决方法。

【问题讨论】:

    标签: c# model-view-controller encoding routing


    【解决方案1】:

    查看 System.Web.Routing 看起来这是因为路由值不是使用 HttpUtility.UrlEncode(value) 编码的 URL,但实际上是使用 Uri.EscapeUriString(value) 进行“转义”的。

    违规代码在System.Web.Routing.ParsedRoute:

    // Dev10 601636 Work around Uri.EscapeUriString not encoding #,&
        private static string UrlEncode(string str) {
            string escape = Uri.EscapeUriString(str); 
            return Regex.Replace(escape, "([#;?:@&=+$,])", new MatchEvaluator(EscapeReservedCharacters));
        }
    

    可能是设计决定的(必须向微软人员询问),因为正斜杠是路由中相当不可或缺的一部分。如果是,我觉得有点奇怪,因为documentation for Uri.EscapeUriString() 指出它的主要用法是:

    使用 EscapeUriString 方法准备一个未转义的 URI 字符串作为 Uri 构造函数的参数。

    按照生成路由 URL 的代码,它似乎根本没有使用 Uri 类 - URL 是构造并以字符串形式返回的。

    如果您将其作为查询字符串参数传递,而不是作为指定路由的一部分,它将被正确地进行 URL 编码(但当然会改变 URL 的结构)。

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2011-10-11
      • 2021-11-17
      相关资源
      最近更新 更多