【问题标题】:UrlHelper.IsLocalUrl method always returns "false" for non-ASCII stringsUrlHelper.IsLocalUrl 方法对于非 ASCII 字符串总是返回“false”
【发布时间】:2012-09-28 14:56:08
【问题描述】:

我最近检测到,如果 url 参数中检测到非 ASCII 字符,UrlHelper.IsLocalUrl 方法总是返回 false

例子:

var isLocal = UrlHelper.IsLocalUrl("контакты"); //false

这是一个错误,还是“设计使然”?

【问题讨论】:

  • 这个方法真的应该叫IsLocalPath,因为scheme和host都被忽略了。

标签: asp.net-mvc


【解决方案1】:

最新的可用实现正在检查这些条件:

  • 网址以"/"开头,后面不跟"/""\"
  • 或url以"~"开头,后跟"/"

因此,传递给此方法的所有 url 必须以 "/""~/" 开头。

此外,如果您想知道,它不会考虑当前主机并检查诸如 http 之类的方案。

更新: 这是UrlHelper.IsLocalUrl使用的实现的链接 http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/600963a4df15#src/System.Web.WebPages/RequestExtensions.cs

【讨论】:

  • 嗨塞巴斯蒂安!当这个问题通常与 ASP.NET MVC 相关时,您似乎在谈论 Orchard CMS :) 我看到您最近在 Orchard 中添加了 IsLocalUrl 的自定义实现,但我没有是时候测试它了。将尝试尽快提供反馈。谢谢!
  • 我说的不是 Orchard,而是 MVC 4 本身。正如您所注意到的,由于 MVC 行为,我们确实实现了一个自定义的行为。
  • 我接受这个答案,因为它更好地反映了当前状态。
  • 对于那些感兴趣的人:自 MVC 3 以来,行为发生了变化。不幸的是,在 MVC 3 中,当前主机已经到位,但现在它不再存在。这是一个突破性的变化。
  • 链接失效了,这是 CodePlex 的问题吗?
【解决方案2】:

可能是因为 RFC 中的 URL 是由 US-ASCII 代码集定义的,带有保留字符。
您可以在此处阅读有关 URL 规范的信息:http://www.ietf.org/rfc/rfc1738.txt

以及来自上述网站/文档的引用:

URL 仅使用 US-ASCII 编码字符集。八位字节 80-FF 十六进制不是 在 US-ASCII 中使用,八位字节 00-1F 和 7F 十六进制表示 控制字符;这些必须被编码。

简而言之,我的猜测是“设计使然”。

注意:RFC 是由 IETF 制定的,它制定了 URL 等一些技术的标准。

【讨论】:

  • 是的,似乎 ASP.NET MVCs UrlHelper.IsLocalUrl` 实现严格遵循 RFC 1738。老实说,我不明白他们为什么严格遵循近 20 年的标准.互联网在发展,如果 ASP.NET MVC 仍想被称为“现代 Web 框架”,则需要考虑到这一点。
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2019-12-05
  • 2022-09-27
相关资源
最近更新 更多