1

我们有一条路线定义为

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 错误,这将无济于事。

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

4

1 回答 1

2

空格(和大多数其他特殊字符)必须经过 URL 编码才能在 URL 的路径中使用。但是,这是一种不好的做法,应该避免。请参阅(请)停止在 URL 中使用不安全字符

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

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

并像使用...

/search?text=Some%20Text

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

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

/search/for/some-text

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

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

于 2017-09-02T16:19:34.650 回答