我们的路线定义为
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错误。
是否可以在不以某种方式编码文本参数的情况下解决此问题?
空格(以及大多数其他特殊字符)必须编码URL,以便在URL路径中使用。但是,这是一种不好的做法,应该避免。请参阅(请)停止使用URL中的不安全字符。
一种更好的方法是将查询字符串与不安全字符的URL编码结合使用。
routes.MapRoute(
name: "SearchFor",
url: "Search",
defaults: new
{
controller = "Search",
action = "For"
}
和像...
一样/search?text=Some%20Text
某些防火墙和服务器在路径的一部分时无法正确解释URL编码的信息,但是查询字符串信息更可靠。更不用说上述文章中指出的安全问题。
另外,您可以设计自己的URL来代替不安全的字符来安全的字符...
/search/for/some-text
...但这将需要更多考虑来涵盖您特定用例的所有特殊情况。本质上,您的应用程序需要足够聪明才能将安全角色转换为不安全的字符。
但是,但是您解决了,URL首先是机器可读的,并且在设计它们时必须考虑到它。