【问题标题】:Route containing <space> and forward slash包含 <space> 和正斜杠的路由
【发布时间】:2018-02-10 10:13:30
【问题描述】:

我们有一条路线定义为

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 错误。

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

【问题讨论】:

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


    【解决方案1】:

    空格(和大多数其他特殊字符)必须经过 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 首先是机器可读的,您在设计它们时必须考虑到这一点。

    【讨论】:

    • 感谢您提供非常有用的信息,尤其是那篇文章。
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2011-05-15
    • 2018-03-30
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多