我们的路线定义为
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
}
但是,如果文本
包含正斜杠的前导空格,则这没有帮助,例如item/1
导致 IIS 返回 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 首先也是最重要的是要使机器可读,您在设计 URL 时必须考虑到这一点。
关于asp.net-mvc - 包含 <space> 和正斜杠的路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45998667/