这篇博文是记录学习udacity的课程http & web servers的第三篇。
Parts of a URI
网络地址也叫做URI,统一资源标识符。
从网络用户的角度来看,URI就是一段文本你键入到浏览器,告知浏览器你想访问哪个页面。
从网络开发者的角度来看,URI要稍微复杂点.
你或许见过术语URL,或者统一资源定位符。两者非常接近。具体来说,url是网络资源的URI。
a URL is a URI for a resource on the network.
因为URI稍微更精确一点,我们在课程中会使用该术语。
不必太担心二者之间的区别。
一个URI即一个资源的名字 - 就比如眼前这个页面,一个维基百科的文章,一个数据资源比如Google地图的api。
URI由几个部分组成,每个部分都有自己对语法。
有些部分是可选的,这就是为什么不同服务的URI不同于彼此。
这是一个URI的例子:https://en.wikipedia.org/wiki/Fish
这个URI有三个可见的部分,由一些标点符号分开:
- https is the scheme;(方案)
- en.wikipedia.org is the hostname;(主机名)
- and /wiki/Fish is the path;(路径)
Scheme
URI的第一部分是方案(scheme),告诉客户端如何获取资源。
常见的URI方案有:http,https,file。
文件URI方案告诉客户端在本地文件系统获取文件。
http和https URI指向网络服务器提供的资源。
http和https URIs看起来基本一样。区别在于,当一个客户端通过https URI去获取一个资源,会使用加密的连接。
加密的网络连接最初用于保护密码和信用卡交易,但现在,很多的网站会使用它们保护用户的隐私。
还有很多其他的URI方案。可在http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml 查看。
Hostname
在http URI中,方案之后就是主机名(hostname):比如www.udacity.com或者localhost。这告知客户端连接到哪个服务器。
我们经常看到网络地址写得和主机名一样。但在html代码中,我们不能这样写<a href="www.google.com">this</a>
就连接到Google。
主机名只能出现在它支持的URI方案之后,比如 http 或者 https 。在这些URIs之后,必须还有 :// 分开方案和主机名。
不是所有的URIs都有主机名。比如 mailto URI只需要一个邮箱地址: malito:spamexample.net 就是一个符合语法规范的 mailto URI。这也稍微更多地展现了URI中的标点符号用法: : 在方案之后,// 在主机名之前。mailto 没有主机名部分,所以没有 // 部分。
Path
在http URI(和很多其他),下一个出现的就是路径,指明了服务器上的一个特定的资源。
一个服务器可以有很多资源在上面 - 比如不提的网页,视频或者api。路径告知服务器客户端要查找的是哪一个资源。
在之前的示例服务器上,你看到的路径与你的文件系统上的文件相对应。
真实世界中,URI路径并不一定与特定的文件名相同。比如,如果你Google搜索,你会看到一个类似
/search?q=ponies 的URI路径。这并不意味着Google服务器上有一个名为 /search?q=ponies 的文件。
服务器解析路径,确定发送什么资源。
在搜索请求的例子中,服务器会发送回之前可能从未存在过的搜索结果页面。
如果写一个没有路径的URI,比如http://udacity.com,浏览器会自动填充默认路径,即一个斜杠。
http://udacity.com和http://udacity.com/ (单斜杆结尾) 是一样的。
一个斜杠的路径也叫做根(root)。
示例服务器的根URI - http://localhost:8000/ -就是你电脑的整个文件系统的根,即网络服务器提供的资源的根。示例服务器不会让浏览器获取不是它运行的目录下的文件。
Relative URI references
查看示例服务器根页面的html源码。看到其中的一个<a>
标签链接到一个文件。
比如:<a href="cliffsofinsanity.png">cliffsofinsanity.png</a>
像这样的URIs没有方案或者主机名,只有一个路径。这就是相对URI引用(relative URI reference)。
这是相对于上下文 - 具体来说,即它出现的页面。
这个URI并不包含主机名或它所在服务器的端口,但浏览器能够从上下文弄清楚。
如果你点击其中的一个链接,浏览器根据上下文知道它需要从原始页面的同一个服务器去拿资源。
Other URI parts
一个URI中可能出现其他的部分。看看下面2个维基百科URIs的区别:
- https://en.wikipedia.org/wiki/Oxygen
- https://en.wikipedia.org/wiki/Oxygen#Discovery
在浏览器中输入上面的链接,会访问维基百科网络服务器上的同一个页面。但第二个会展示页面滚动到氧气的发现这部分内容。
# 符号之后的URI部分叫做 fragment (片段)。 浏览器不会将这部分发送到网络服务器。它只是让一个链接指向某个资源的一个具体的部分;在HTML页面中,它会通过 id 链接到某个元素。
相比之下,看看google搜索的URI:
- https://www.google.com/search?q=fish
?q=fish 是URI的查询部分。这部分会发送到服务器。
URI可能还有其他的部分,可以在下面的维基百科页面查看更多详情: