2009-10-28 253 views
1

我正在编写一个.NET 3.5应用程序,并使用URI.IsWellFormedUriString(string uriString, UriKind uriKind)来验证用户输入的URI;使用UriKind.Absolute。我只是与应用程序打,我有点担心和困惑,为什么是这样的:为什么'http:// dd'是一个有效的URL?

http://ddd

是一个有效的URI?是什么赋予了?我知道这是因为它是RFC的一部分,但为什么它首先是有效的?

我见过的URI一样,唯一的一次,为企业,内部联网就像

http://companyinet

http://localhost(这是很受欢迎,但也有特殊情况)

我不想用我自己的正则表达式,因为有这么多不同的URI正则表达式。但是,我并不想让用户输入不可公开访问的URI。

任何想法或想法?谢谢。

+4

localhost或companyinet根本不是特例。是什么让你相信? – shylent 2009-10-28 20:16:36

+0

,因为99%的用户从不使用这些示例的URL。我说localhost是一个特殊情况,因为它相对于规则被广泛使用。换句话说,这将是该规则的主要例子。我试图说公司是非常罕见的。 – Chad 2009-10-28 20:24:11

+4

你不需要“公司网”。如果你的Windows机器有计算机名称“foo”,并且它运行一个web服务器,那么'http:''// foo';将从盒子本身以及相同子网上的任何其他Windows机器打开它。 – 2009-10-28 20:45:28

回答

16

这是因为它是一个完全有效的URI,你提到定义。

我会改变你的策略略...如果你想,不仅是有效的(如合格的)的URI,而且还有效的,在这个意义上,他们实际上指向一个网站,您将有再添加一个步骤。

串验证后,发出HEAD请求来ping URL。如果它返回一个2xy状态码,那么你可能很好。这在大多数情况下都能正常工作,但并非没有限制和例外。

+1

是的,说到警告,你是不是忘记了重定向(3xy)? – shylent 2009-10-28 20:15:38

+1

我很害怕这个。不要以为你可以扩展“警告和例外”?我能想到的唯一一个是如果用户使用本地网络服务器,在这种情况下,服务器将以2XX状态响应。 – Chad 2009-10-28 20:17:23

+1

HEAD和GET请求通常在实际返回之前遵循重定向。我遗漏了任何细节,因为每个实现都取决于您访问URL的方式会有很大差异。 – jason 2009-10-28 20:17:51

20

是有效的,因为它指向一个独特的资源。在这种情况下,它指向本地网络上的计算机'ddd'的网络服务器(希望)。

URI是唯一资源标识符,不是唯一的万维网资源标识符。文件:///blah.txt也是一个有效的URI

2

这是一个有效的URI因为它遵循URI的语法:它有一个方案和一个具体方案的组分(“HTTP”作为方案”, ':'将两者分开,'// ddd'是特定于方案的部分。)

对于HTTP URI,它也遵循这些语法,'ddd'是有效的主机名。

的URI语法在http://www.ietf.org/rfc/rfc2396.txt

6

因为它符合RFC 1738(以及URI规范RFC 2396)。

的RFC使得对资源的路径,只有由一个方案和方案特定元素的特殊津贴 - 在这种情况下,主机名。只要它识别出独特的资源并符合URI的语法,它就是有效的。

3

你自己回答了这个问题。它是RFC规范定义的“有效的”(格式良好)的URI。

为了帮助解决你所需要的任务,在你的正则表达式中为一个或多个点做一些加法检查(不要忘记逃避它们!),或者尝试点击资源本身以查看它是否实际响应。

1

下面是一个简单的实验,看看该网址为何是有效的:

0)使用或ping实用程序获取google.com的IP地址。我得到:74.125.53.100

1)编辑你的/ etc/hosts文件(在Windows上它类似于C:\ Windows \ system32 \ drivers \ etc \ hosts,你可能需要创建它)。在您的主机文件,添加一行:

74.125.53.100 DDD

不要忘记保存您的修改。

2)在Web浏览器,请访问以下网址:http://ddd

3)你只是使用URL访问谷歌。这就是为什么它是一个有效的URL。

相关问题