包含 <space> 和正斜杠的路由

Route containing <space> and forward slash

我们有一条路线定义为

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 包含正斜杠的前导 space,例如item /1 导致 IIS return 404 错误。

是否可以在不以某种方式对文本参数进行编码的情况下解决这个问题?

空格(和大多数其他特殊字符)必须经过 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 编码信息,当它是路径的一部分时,但查询字符串信息更可靠。更不用说上面文章中提到的安全问题了。

或者,您可以设计 URL 以用不安全字符替换安全字符...

/search/for/some-text

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

但是无论您如何解决它,URL 的首要任务是机器可读,您在设计它们时必须考虑到这一点。