HTTP 协议中 URI 和 URL 有什么区别
从鄙人程序员的角度理解,URI属于URL更低层次的抽象,一种字符串文本标准。
就是说,URI属于父类,而URL属于URI的子类。URL是URI的一个子集。
在《HTTP权威指南》一书中,对于URI的定义是:统一资源标识符;对于URL的定义是:统一资源定位符。
二者的区别在于,URI表示请求服务器的路径,定义这么一个资源。而URL同时说明要如何访问这个资源(http://)。
例如,一个URL通常包括三部分:
方案部分(scheme):http://
地址部分:CEALER | 一些瞬间、一些回忆、一些经典、一些原创、一些愤怒、一些感动
资源部分:/1png
而在C#中,URL类属于SystemSecurityPolicy命名空间,Uri属于System。在MSDN对Url类的备注中,能更好的说明Url与Uri的区别:
Url 证据的存在将在授予集内生成 UrlIdentityPermission。如果有对 UrlIdentityPermission 的 Demand,则与 Url 证据对应的 UrlIdentityPermission 将与请求的权限进行比较。
考虑完整的 URL,包括协议(HTTP、HTTPS、FTP)和文件。例如,Microsoft Home Page 就是一个完整的 URL。
URL 可以精确匹配,也可在最后一个位置使用通配符来匹配。例如,Microsoft Home Page 就是一个含通配符的 URL。
而Uri类在实例化的时候,可以指定为绝对路径,相对路径,但可以不指定到具体的某个资源。
那么我理解的二者的区别就是:
URI可以表示一个域,也可以表示一个资源。
URL只能表示一个资源。
同样的,URN(统一资源名称)也是URI的一个子集,目前没有大规模运用。
HttpWebRequestHost 属性
NET Framework 46 and 45
其他版本
获取或设置要在 HTTP 请求中独立于请求 URI 使用的 Host 标头值。
命名空间: SystemNet
程序集: System(在 Systemdll 中)
语法
C#
C++
F#
VB
public string Host { get; set; }
属性值
类型:SystemString
HTTP 请求中的 Host 标头值。
异常
异常
条件
ArgumentNullException
不能将主机标头设置为 null。
ArgumentException
不能将主机标头设置为无效值。
InvalidOperationException
在已经开始发送 HttpWebRequest 之后,不能设置主机标头。
备注
Host 属性可用于设置要在 HTTP 请求中独立于请求 URI 使用的 Host 标头值。 Host 属性可以由一个主机名和可选的端口号组成。 不包含端口信息的 Host 标头表示所请求服务的默认端口(例如,对于 HTTP URL 为 端口 80)。
用来指定主机和端口的格式必须遵照由 IETF 发布的 RFC2616 的 1423 小节中的规则。 符合指定端口 8080 的这些要求的示例是 Host 属性的以下值:
wwwcontosocom:8080
使用 Host 属性来显式指定自定义的主机头值也会影响缓存的区域、cookie 和身份验证。 当应用程序向特定的 URI 前缀提供凭据时,该应用程序需要确定使用包含主机标头值的 URI,而不是 URI 中的目标服务器。 该缓存资源时使用的键使用主机标头值,而不是请求 URI。 Cookie 存储在 CookieContainer 中,并按服务器域名逻辑分组。 如果应用程序指定一个主机标头,则将此值用作域。
如果未设置 Host 属性,则在 HTTP 请求中使用的主机标头值基于请求 URI。
版本信息
NET Framework
受以下版本支持:45、4
NET Framework Client Profile
受以下版本支持:4
平台
Windows 81, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)
URI:统一资源标志符(Uniform Resource Identifier)
URL:统一资源定位符(uniform resource location)
URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。
HTTP分为URI,HEADER,Body三个部分。每个部分都可以包含请求信息,那么每个部分是否都有请求大小限制呢?刚开始以为这个问题很容易找到答案,后来发现这也是个挺复杂的问题。
URI
首先是URI,我们知道,在GET请求中,请求参数是放在URL进行传递的,所以,HTTP GET的请求最关心的一个问题:能有多长?我能放多少参数?URI
从HTTP 11协议中开始找:(RFC 2616)
The HTTP protocol does not place any a priori limit on the length of a URI
所以明确一点的是HTTP协议是没有显式限制URI的长度的。理论上来说你在URI中传递多少参数都是可以的。
但是现实往往无法永远照进阳光:
1 浏览器限制
所有主流浏览器都会对URI的长度进行限制。如果你在浏览器中输入过长的URI,那么浏览器会自动进行截断。各个浏览器对URI长度的限制各不相同,甚至不同版本也不一样。大约一个概念,2000字符以内的URI都能符合所有主流浏览器的要求。
2 服务端限制
即使客户端同意发送无限长度的URI,但是服务器一方一般都是有长度限制的。一般服务是没有专门针对URI的参数限制的,但是由于URI是会包含在request header中的,所以对header的大小限制是会对URI起作用的,比如nginx的(large_client_header_buffers)这个属性,它默认是4k。
题外话
这里的“URI是包含在request header中的” 这句话其实是有问题的。URI在HTTP协议中是叫做request-Line的,如果具体看协议,是会发现request-Line和request-header是两个不一样的,就是说request的请求其实该分为request-line, request-header, request-body三个部分的(具体可以看 http://wwwietforg/rfc/rfc2616txt 第4和5章)。但是好像使用的时候都默认将header中理解为包含了request-line(比如这篇文章 http://trafficserverapacheorg/docs/v2/sdk/HTTPHeadershtml )。这里估计是概念和使用的时候导致问题,不必深究了,所以我们不妨将request-line理解为包含在header中就好。
不管如何,综上所述,这里的URI不论是客户端还是服务端,基本是被默认限制住的。
Header
header中存放的信息非常多,比如request-line,cookie,还有各种key-value的特定header字段和值。有点时候,我们也会往header中添加一些自定义的属性。header的长度和URI的情况是一样的。协议中并没有显示限制header的大小。理论上在header中放多少属性都是可以的。
但是实际上:
1 浏览器限制
各个主流浏览器限制几十k~几百M不等的限制。基本上能满足平时的需求了。但是如果这个长度对你业务有很大影响的话,建议还是亲自测试下。
2 服务端限制
比如nginx的large_client_header_buffers就限制了header的长度。你也可以自己设置。
可能会影响header的参数还有:
client_header_buffer_size
client_header_timeout
各参数可以参考: http://wikinginxorg/HttpCoreModule
Body
body和URI,header非常不一样,不一样的地方原因在于文件上传。HTTP是支持request中带文件的,那么文件的二进制数据不会放在URI或者header里面,它是放在body里面的。那么这个body的大小就一定不能默认限制太小,尤其是客户端。
首先理论上,协议是没有对body大小做任何限制的。
其次,浏览器也没有对body做任何大小限制,因为如果浏览器做了大小限制就意味着它直接影响了你的服务功能。
所以对body的限制的任务就放在了服务器上了。这里就我最熟悉的nginx+php-fpm来看下有哪些地方可以对body进行限制:
1 nginx有一些设置会对body大小产生影响
client_max_body_size,这个参数可以限制body的大小,默认是1m
client_body_timeout,当body太大,或者网络太差的时候,这个也有可能会影响请求的成功率的。
2 phpini也有一些设置会对上传的body数据产生影响
upload_max_filesize,限制最大上传文件大小
post_max_size ,限制post的大小
memory_limit,限制内存使用大小
max_execution_time,这个是php最大执行时间,也有可能影响请求成功率的。
HTTP请求大小有什么影响
首先是安全因素考虑。
试想一下一个网站的服务器是不限制body大小的,那么它就是可以被黑客利用攻击的地方了。黑客利用这一点往HTTP POST的body中传递非常大(比如几M)的请求。那么比如像nginx+php-fpm这样的,就会占用了服务器一个php进程专门处理这个请求,就会导致你对外无法提供其他的服务了,你的服务就瘫痪了,这就是DDOS攻击。
其次是文件上传服务考虑。
文件上传有两种情况:
你可能经常遇到为什么文件上传失败?那么大多是上文说的几个设置没有设置对。
其次,文件上传大小是不是设置越大越好?答案必须是否定的,理由也是安全考虑。满足需求的大小限制就够了。
这里就可以理解为什么大都把文件上传和业务接口分开来提供了吧。如果你的文件上传服务和业务接口是同一个机器的话,那么就说明你的业务接口可以允许的body大小一定是很大的。换句话说,在这种情境下,你的业务中的所有POST请求都是不安全的!!只要进行DDOS攻击,业务就会瘫痪。
Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通
用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。
URI一般由三部分组成:
访问资源的命名机制。
存放资源的主机名。
资源自身的名称,由路径表示。
考虑下面的URI,它表示了当前的HTML 40规范:
http://wwwwebmonkeycomcn/html/html40/
这个URI是这样的:这是一个可通过HTTP协议访问的资源,位于主
机wwwwebmonkeycomcn上,通过路径“/html/html40”访问。在HTML文档中
其它资源包括"mailto"(收发email)和"ftp"(FTP访问)。
这是URI的另一个例子,指向一个用户的邮箱:
<A href="Joe'>mailto:joe@someplacecom">Joe Cool</A>
注:大多数读者可能熟悉"URL",而不是URI。URL是RUI命名机制的一个子集。
片段标志符
有的URI指向一个资源的内部。 这种URI以"#"结束,并跟着一个anchor标志
符(称为片段标志符)。例如,下面是一个指向section_2的URI:
http://somesitecom/html/tophtm#section_2
相对URI
相对URI 不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相
对URI可能含有相对路径(如,“”表示上一层路径),还可能包含片段标
志符。
为了说明相对URI,假设我们有一个基本的URI http://wwwacmecom/support/introhtm
下面的链接中使用了相对URI:
<A href="suppliershtm">Suppliers</A>
它扩展成完全的URI就是 "http://wwwacmecom/support/suppliershtm",
下面是一个图像的相对URI:
<IMG src="/icons/logogif" alt="logo">
它扩展成完全的URI就是 "http://wwwacmecom/icons/logogif"。
在HTML中,URI被用来:
链接到另一个文档或资源(参看A和LINK元素)。
链接到一个外部样式表或脚本(参看LINK和SCRIPT元素)。
在页内包含图像、对象或applet(参看IMAG、OBJECT、APPLET和INPUT
元素)。
建立图像映射(参看MAP和AREA元素)。
提交一个表单(参看FORM)。
建立一个框架文档(参看FRAME和IFRAME元素)。
引用一个外部参考(参看Q、BLOCKQUOTE, INS和DEL元素)。
指向一个描述文档的metadata(参看HEAD元素)。
2什么是URL:
URL是Uniform Resource Location的缩写,译为“统一资源定位符”。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
◇ URL的格式
URL的格式由下列三部分组成:
第一部分是协议(或称为服务方式);
第二部分是存有该资源的主机IP地址(有时也包括端口号);
第三部分是主机资源的具体地址。,如目录和文件名等。
第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。
◇ URL示例
文件的URL:
用URL表示文件时,服务器方式用file表示,后面要有主机IP地址、文件的存取路径(即目录)和文件名等信息。有时可以省略目录和文件名,但“/”符号不能省略。
例一:file://ftpyoyodynecom/pub/files/foobartxt
代表存放主机ftpyoyodynecom上的pub/files/目录下的一个文件,文件名是foobartxt。
例二:file://ftpyoyodynecom/pub
代表主机ftpyoyodynecom上的目录/pub。
例三:file://ftpyoyodynecom/
代表主机ftpyoyodynecom上的根目录。
Gopher的URL:
Gopher服务器有可能使用特殊的端口,在这种情况下,主机IP地址与端口之间要用“:隔开。
例一:gopher://gopheryoyodynecom/
表示主机gopheryoyodynecom上的gopher服务器。
例二:gopher://gopherbanzaiedu:1234
表示主机gopherbanzaiedu上的gopher服务器,在端口1234上。
网络新闻的URL:
利用URL表示网络新闻组时,如果是usenet的话只要指定出新闻组的名字即可。
例如:news:recgardening
表示usenet上的recgardening新闻组(园艺)。
HTTP的 URL:
使用超级文本传输协议HTTP,提供超级文本信息服务的资源。
例一:http://wwwpeopledailycomcn/channel/welcomehtm
其计算机域名为wwwpeopledailycomcn。超级文本文件(文件类型为html)是在目录/channel下的welcomehtm。这是中国人民日报的一台计算机。
例二:http://wwwrolcnnet/talk/talk1htm
其其计算机域名为wwwrolcnnet。超级文本文件(文件类型为html)是在目录/talk下的talk1htm。这是瑞得聊天室的地址,可由此进入瑞得聊天室的第1室。
URI、URL和URN之间的区别与联系
URI:Uniform Resource Identifier,统一资源标识符;
URL:Uniform Resource Locator,统一资源定位符;
URN:Uniform Resource Name,统一资源名称。
其中,URL,URN是URI的子集。
Web上地址的基本形式是URI,它代表统一资源标识符。有两种形式:
URL:目前URI的最普遍形式就是无处不在的URL或统一资源定位器。
URN:URL的一种更新形式,统一资源名称(URN, Uniform Resource Name)不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。
URI是以某种统一的(标准化的)方式标识资源的简单字符串。
URI一般由三部分组成:
1 访问资源的命名机制。
2 存放资源的主机名。
3 资源自身的名称,由路径表示。
典型情况下,这种字符串以scheme(命名URI的名字空间的标识符——一组相关的名称)开头,语法如下:
[scheme:] scheme-specific-part
URI以scheme和冒号开头。Scheme用大写/小写字母开头,后面为空或者跟着更多的大写/小写字母、数字、加号、减号和点号。冒号把scheme与scheme-specific-part分开了,并且scheme-specific-part的语法和语义(意思)由URI的名字空间决定。如下面的例子:
http://wwwcnncom,其中http是scheme,//wwwcnncom是 scheme-specific-part,并且它的scheme与scheme-specific-part被冒号分开了。
URI有绝对和相对之分,绝对的URI指以scheme(后面跟着冒号)开头的URI。前面提到的http://wwwcnncom就是绝对的URI的一个例子,其它的例子还有mailto:jeff@javajeffcom、news:complangjavahelp和xyz://whatever。你可以把绝对的URI看作是以某种方式引用某种资源,而这种方式对标识符出现的环境没有依赖。如果使用文件系统作类比,绝对的URI类似于从根目录开始的某个文件的径。
与绝对的URI不同的,相对的URI不是以scheme(后面跟着冒号)开始的URI。 它的一个例子是articles/articleshtml。你可以把相对的URI看作是以某种方式引用某种资源,而这种方式依赖于标识符出现的环境。如果用文件系统作类比,相对的URI类似于从当前目录开始的文件路径。
URL是Uniform Resource Location的缩写,译为"统一资源定位符"。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL的格式由下列三部分组成:
第一部分是协议(或称为服务方式);
第二部分是存有该资源的主机IP地址(有时也包括端口号);
第三部分是主机资源的具体地址。,如目录和文件名等。
第一部分和第二部分之间用"://"符号隔开,第二部分和第三部分用"/"符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。
目前最大的缺点是当信息资源的存放地点发生变化时,必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法,例如:URI(Universal Resource Identifier)即"通用资源标识"(参见RFC 1630)、URN(Uniform Resource Name)即"统一资源名"和URC(Uniform Resource Citation)即"统一资源引用符"等。
URI目前还处在进一步的研究当中。研究的方向就是弥补URL目前存在的缺点。
----------------------------------------------
简单理解就是URL是大门,URI是门里的每个屋子。
URL:
URL是Uniform Resource Location的缩写,既然楼主知道我就不啰嗦了
URI 是在 Internet 上定位资源的常规方案,它的着重点在于资源,而不是位置。理论上,URI 可以查找镜像文档的最近的副本,或者定位从一个站点移动到另一个站点的文档。
URI是Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。
URI一般由三部分组成:
1 访问资源的命名机制。
2 存放资源的主机名。
3 资源自身的名称,由路径表示。
注:大多数人可能熟悉"URL",而不是URI。URL是URI命名机制的一个子集。
区别就是URI定义资源,而URL不单定义这个资源,还定义了如何找到这个资源。 比如说,一个服务器上,到一个文件夹/网页的绝对地址(absolute path)就是URI。
摄像机URi是统一资源标识符。
客户端会向服务器发送请求消息,请求消息中包含的内容是对什么和进行怎样的操作 两个部分,在摄像过程中,摄像头会从给定的RTSP统一资源标识符中流式传输,通过特定命名空间中的唯一名称或ID来标识资源。
URI的作用
在电脑术语中,统一资源标识符是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何的资源通过特定的协议进行交互操作,绝对URL包含了指向目录或者文件的完整信息,包括模式,主机名和路径对于FTP站点以及几乎所有的不使用HTTP协议的URL都应该使用绝对的URL。
0条评论