如果空间在路径值中显示为“+”char,则路由无法识别路由

时间:2013-03-08 12:48:10

标签: c# .net asp.net-mvc-4 asp.net-routing

我遇到了以下问题。也许有人发现了这种奇怪的行为。

我在global.asax.cs中有以下路由定义:

routes.Add(new Route("/module/{searchTerm}", new RouteValueDictionary { {"controller", "Module"}, {"action", "Index"} }, null, new MvcRouteHandler()));

因此,从第一个角度来看,没有什么特别之处,但当搜索字词中的空格显示为+符号时会出现问题。

例如,我们尝试打开一个链接:

http://[myserver]/module/some%20search%20term

在这种情况下,一切正常,它会将我们重定向到正确的操作,但如果链接如下:

http://[myserver]/module/some+search+term

我收到错误声明没有与提供的网址匹配的路线。

顺便说一句,我无法在ASP.NET开发服务器上重现此问题。它只出现在IIS上。可能有人确实有这样的问题吗?

3 个答案:

答案 0 :(得分:1)

  • URL的路径部分中的百分比编码应该被解码,但是
  • 路径组件中的任何+字符都应按字面处理。

要明确:+只是查询组件中的特殊字符。

RFC 1738(由2396和3986修改)定义了方案(http :),权限(//server.example.com)和路径(/myfile/mypage.htm)组件,而不是为+字符定义任何特殊含义。

答案 1 :(得分:0)

+符号是段的分隔符。细分是方案,权限,路径和查询。

来自URI RFC

  

2.2。保留字符

     

许多URI包含由某些组成或由其分隔的组件   特殊字符。这些字符称为“保留”,因为
  它们在URI组件中的使用仅限于它们的保留
  目的。如果URI组件的数据与
发生冲突   保留目的,然后必须在之前转义冲突的数据   形成URI。

  reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                "$" | ","
     

上面的“保留”语法类指的是那些字符   在URI中是允许的,但在一个URI中是不允许的   通用URI语法的特定组件;它们用作
  第3节中描述的组件的分隔符。

显然,这在卡西尼中得到了很好的实施。

答案 2 :(得分:0)

    如果在IIS设置中禁止双重转义,则
  • 登录路径部分URL不起作用。它是请求过滤策略的一部分。但它可以在web.config中配置 Is Enabling Double Escaping Dangerous?

当我在web.config中启用它时,一切都开始正常工作了。