Ruby on rails 验证Rails中的URL域

Ruby on rails 验证Rails中的URL域,ruby-on-rails,regex,validation,url,Ruby On Rails,Regex,Validation,Url,我想验证一个URL,所以我搜索并找到了 布莱恩·雷在他的帖子中说 “@Tate的答案适用于完整URL,但如果您想验证域列,您不希望允许其正则表达式允许的额外URL位(例如,您肯定不希望允许带有文件路径的URL) 因此,我删除了regex的协议、端口、文件路径和查询字符串部分,结果是: 我完全不明白他说了什么。URL如何成为文件的路径?什么是“域列”?URL由几个部分组成。如果您有一个非常简单的URL,例如: http://www.example.com:1234/path/to/file.htm

我想验证一个URL,所以我搜索并找到了

布莱恩·雷在他的帖子中说

“@Tate的答案适用于完整URL,但如果您想验证域列,您不希望允许其正则表达式允许的额外URL位(例如,您肯定不希望允许带有文件路径的URL)

因此,我删除了regex的协议、端口、文件路径和查询字符串部分,结果是:


我完全不明白他说了什么。URL如何成为文件的路径?什么是“域列”?

URL由几个部分组成。如果您有一个非常简单的URL,例如:

http://www.example.com:1234/path/to/file.html?key1=value1&key2=value2
这些部分是:

  • 协议:http://
  • 主持人:www
  • 域名:example.com
  • 港口:1234
  • 文件路径:path/to/file.html
  • 查询字符串:key1=value1&key2=value2
唯一不能省略的部分是协议(但许多程序允许默认为http://)和主机名。每一部分对其法律性质都有自己的要求。更糟糕的是,并非所有的web服务器都同意这些要求是什么。因此,在不进行实际连接和查看是否出现故障的情况下,唯一可以检查的是与web服务器联系所需的部分。这只是协议、主机和域名以及端口。这些都不区分大小写(其余的可能不区分大小写)。我不确定主机或域名中的有效字符是什么,但这也是名称服务器可能不符合规范的地方

简而言之,检查URL是否有效的唯一方法是尝试与它建立连接。如果你的程序使用一些魔法拒绝URL(或电子邮件地址),一些人会因此讨厌你和/或他们的互联网提供商(因为即使你的检查符合规范,一些主机或域名也不会)


关于URL如何引用本地文件的问题,有一个特殊的协议:
file://
。由于路径也必须以/开头,因此会产生类似
file:///home/user/file.html
,因此开头有三个斜杠。

URL由几个部分组成。如果您有一个非常简单的URL,例如:

http://www.example.com:1234/path/to/file.html?key1=value1&key2=value2
这些部分是:

  • 协议:http://
  • 主持人:www
  • 域名:example.com
  • 港口:1234
  • 文件路径:path/to/file.html
  • 查询字符串:key1=value1&key2=value2
唯一不能省略的部分是协议(但许多程序允许默认为http://)和主机名。每一部分对其法律性质都有自己的要求。更糟糕的是,并非所有的web服务器都同意这些要求是什么。因此,在不进行实际连接和查看是否出现故障的情况下,唯一可以检查的是与web服务器联系所需的部分。这只是协议、主机和域名以及端口。这些都不区分大小写(其余的可能不区分大小写)。我不确定主机或域名中的有效字符是什么,但这也是名称服务器可能不符合规范的地方

简而言之,检查URL是否有效的唯一方法是尝试与它建立连接。如果你的程序使用一些魔法拒绝URL(或电子邮件地址),一些人会因此讨厌你和/或他们的互联网提供商(因为即使你的检查符合规范,一些主机或域名也不会)


关于URL如何引用本地文件的问题,有一个特殊的协议:
file://
。由于路径也必须以/开头,因此会产生类似
file:///home/user/file.html
,因此开头有三个斜杠。

检查他邮件底部的示例链接。用正则表达式验证除简单URL以外的任何内容都会适得其反。最好编写一个使用
URI.parse
@douglasfshear的自定义验证。您的意思是,如果
URI.parse
没有引发
URI::InvalidURIError
,那么它就是一个有效的URI吗?是的,完全正确。验证URL的另一种实用方法是向其发出请求,并检查是否有非50X响应。URI.parse('xxx')不要提出,我不知道如何使用它(假设'xxx'不被认为是ok URL)。检查他消息底部的示例链接。用正则表达式验证任何东西,但简单URL除外,会产生反效果。最好编写一个使用
URI.parse
@douglasfshear的自定义验证。您的意思是,如果
URI.parse
没有引发
URI::InvalidURIError
,那么它就是一个有效的URI吗?是的,完全正确。验证URL的另一种实用方法是向其发出请求,并检查是否有非50X响应。URI.parse('xxx')不引发,我不知道如何使用它(假设'xxx'不被视为ok URL)。