包含<space>和正斜杠

时间:2017-09-01 10:52:57

标签: asp.net-mvc routes asp.net-mvc-routing routeconfig

我们有一条定义为

的路线
routes.MapRoute(
            name: "SearchFor",
            url: "Search/For/{text}",
            defaults: new
            {
                controller = "Search",
                action = "For",
                text = UrlParameter.Optional
            }

在新客户的数据恰好包含大量正斜杠后,我们遇到text问题,例如item/1。为了解决这个问题,路线已经更新,包括一个捕获全部如下

routes.MapRoute(
            name: "SearchFor",
            url: "Search/For/{*text}",
            defaults: new
            {
                controller = "Search",
                action = "For",
                text = UrlParameter.Optional
            }

但是,如果text包含正斜杠的前导空格,则无效item /1导致IIS返回404错误。

是否可以在不以某种方式编码text参数的情况下解决此问题?

1 个答案:

答案 0 :(得分:2)

空格(以及大多数其他特殊字符)必须经过URL编码才能在URL路径中使用。但是,这是一种不好的做法,应该避免。请参阅(Please) Stop Using Unsafe Characters in URLs

更好的方法是将查询字符串与不安全字符的URL编码结合使用。

routes.MapRoute(
        name: "SearchFor",
        url: "Search",
        defaults: new
        {
            controller = "Search",
            action = "For"
        }

用得像......

/search?text=Some%20Text

某些防火墙和服务器在路径的一部分时无法正确解释URL编码信息,但查询字符串信息更可靠。更不用说上面文章中提到的安全问题了。

或者,您可以设计自己的网址,将不安全字符替换为安全字符...

/search/for/some-text

...但是需要更多考虑覆盖您特定用例的所有特殊情况。从本质上讲,您的应用程序需要足够智能,以便将安全字符转换为不安全的字符。

但是无论你如何解决它,首先要使URL成为机器可读的,你必须在设计它时考虑到这一点。