【问题标题】:Why is filter_var with FILTER_VALIDATE_URL showing this string as a valid URL?为什么带有 FILTER_VALIDATE_URL 的 filter_var 将此字符串显示为有效 URL?
【发布时间】:2019-04-19 02:38:48
【问题描述】:

输入字符串是:

https://lh

但是,有:

var_dump(filter_var('https://lh', FILTER_VALIDATE_URL)) // string(10) "https://lh"

由于某种原因,上述字符串被归类为有效 URL。我读过另一篇 SO 帖子说 FILTER_VALIDATE_URL 不限于 http 协议,但上面的链接肯定不是任何协议的有效 URL。

为什么会这样?

【问题讨论】:

  • 其实就是一个有效的URL。
  • 这个网址有什么问题?是因为,它只是一个顶级域名吗?
  • 使 URL 有效的原因在于它是否符合规范 rfc 3986(虽然我相信 FILTER_VALIDATE_URL 仍然使用旧的 rfc 2396,但这里的差异无关紧要。)
  • 尝试致电parse_url() 并对各个部分执行额外的验证步骤。请注意:您似乎对有效 URL 和主机名的外观有很多不正确的假设。
  • @FunkFortyNiner 正如其他人所说,有效的 URL 不必使用 FQDN - 它可以只使用主机名。 protocol://host:port/path/filename.foo?arguments 协议和主机名是启动连接所需的唯一内容,主机名上唯一的关键部分是客户端必须能够解析它 - 主机文件、dns、带有附加搜索域的 dns,等等...

标签: php url filter-var


【解决方案1】:

好的,后来有很多 cmets 有一些题外话,没有发布答案。

所以……

有效的 URL 不必使用 FQDN - 它可以只使用主机名。 protocol://host:port/path/filename.foo?arguments 协议和主机名是启动连接所需的唯一内容,主机名上唯一的关键部分是客户端必须能够解析它 - 主机文件、dns、带有附加搜索域的 dns,等等

如果任何其他评论者觉得需要编辑等,请随意。

【讨论】:

  • 客户端不需要能够解析主机名以使 URL 有效。
猜你喜欢
  • 2011-01-09
  • 2017-07-21
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多