请求地址最后面的“/”加和不加到底有什么区别?

请求地址最后面的“/”加和不加到底有什么区别?

使用tcpdump和wireshark分析tcp流

URL 是我们天天畅游在互联网天下中最最常见的器械了,对于普通用户来说,URL 就是一个字符串,好比 http://www.baidu.com ,然则对于我们开发者而言,除了 URL,另有一个器械叫做 URI,很多人经常搞不清楚这两个观点,本文我们就从这个话题最先。

从 URN 最先

在先容这两个器械之前,我们还得先说说另外一个器械,叫做URN,URN的全程为Uniform Resource 译作统一资源名称,URN、URL与URI的关系类似于下图:

请求地址最后面的“/”加和不加到底有什么区别?

 

由上图可以看到,URN 和 URL 现实上是 URI 范围之内的观点。URN 示意给每一个互联网资源取一个名字,然则互联网资源千千万万,给每一个资源取一个不重复的名字显然不太现实,因此,并不是所有的互联网资源都有 URN ,URN 就类似于一小我私家的身份证号码,是唯一的,然则通过这个身份证号码找不到这小我私家,要找到这小我私家我们得通过类似于下面这种地址 “中国/广东省/广州市/天河区/马场路/南国花园/8栋/1203室” ,这种能够查找到某一个资源的字符串就是 URL ,URL 全称叫做 Uniform Resource Locator ,译作统一资源定位符,示意一个资源的地址。

URL 与 URI

URI 是 Uniform Resource Identifier 的缩写,译作统一资源标识符,RFC2396 中对这三个单词做了如下界说:

Uniform

划定统一的花样可利便处置多种差别类型的资源,而不用凭据上下文环境来识别资源指定的接见方式。另外,加入新增的协议方案(如 http: 或 ftp:)也更容易。

Resource

资源的界说是“可标识的任何器械”。除了文档文件、图像或服务(例如当天的天气预报)等能够区别于其他类型的,全都可作为资源。另外,资源不仅可以是单一的,也可以是多数的集合体。

Identifier

示意可标识的工具。也称为标识符。

由此可见,URI 就是由某个协议方案示意的资源的定位标识符,而协议方案就是接见资源时所接纳的协议类型的名称,好比我们接纳 HTTP 协议时,协议方案就是 HTTP ,我们接纳 FTP 协议时,协议方案就是 FTP ,另外另有 file、mailto、telnet 等。

根据 RFC3986 的说法,一个 URI 可以被进一步归类为一个定位器(URL),一个名字(URN),或两者都是。也就是说 URI 可以是 URL ,也可以是 URN 或两者兼备,若是你体贴资源的名称,那就将 URI 界说成 URN 的形式,若是你体贴资源的位置,那么就将 URI 界说成 URL 的形式,URI 中包罗了 URN 和 URL 。在 RFC3986 文档中另有如下一句话:

“Future specifications and related documentation should use the general term “URI” rather than the more restrictive terms “URL” and “URN””

这句话告诉我们未来应该使用加倍通用的 URI 术语,而不是受限制颇多的 URL 和 URN 。

前面先容了 URI ,接下来我们再来探讨下 URI 的花样(基于前文得出的结论,下面涉及到的地址我将都以 URI 来称谓)。

H3C交换机SSH配置完全攻略

URI 的花样

对于普通用户,说 URI 他们可能有点懵,然则说 http 开头的谁人字符串肯定都知道是什么了,我们常见的网址除了 http: 开头之外,也有 ftp: 开头的,也有 mailto: 开头的,划分代表差别的寄义,这是由于浏览器的功效不仅仅局限于接见 web 服务器,也可以用来接见 ftp 服务器,也可以用来浏览内陆文件,也可以用来发送邮件,因此浏览器需要有一个器械来判断使用哪种功效来接见响应的数据,因此有了协议,也有了林林总总差别的 URI 。如下图是一个完整的URI:

请求地址最后面的“/”加和不加到底有什么区别?

 

这其中用户名、密码和端口号都可以省略,在浏览器拿到这样一个 URI 之后,首先会对其举行剖析,好比上面这个地址,浏览器经由剖析之后,知道要去获取 www.baidu.com 服务器上的 /folder/index.html 文件。不外,在现实应用中,有的时刻 URI 并不是这么清晰,好比下面这个:

http://wwww.baidu.com

这种 URI 并没有直接指定要接见哪个文件,像这种没有路径的情形,就代表接见根目录下预先设置的默认文件,一样平常就是 /index.html, /default.html 一类的文件,在 JAVA 中,我们也可以在 web.xml 中来设置这个默认文件。

有的时刻我们另有可能遇到下面这种地址:

http://www.baidu.com/folder/

这个 URI 以一个 / 末端,示意 folder 是一个目录,我们要接见的是这个目录下的文件,然则又没有说明是这个目录下的哪个文件,此时依然是接纳该目录下 index.html 或者 default.html 一类的文件。

有的时刻,我们还可以看到下面这种 URI:

http://www.baidu.com/folder

即 folder 后面没有 / ,此时会先将 folder 看成一个资源去接见(好比一个名为 folder 的 Servlet ),若是没有名为 folder 的资源,那么浏览器会自动在 folder 后面加上一个 / ,此时地址变为 http://www.baidu.com/folder/ ,folder 是一个目录,然后就会去实验接见 folder 目录下的 index.html 或者 default.html 。 注重这种自动调整只在浏览器中存在,若是你的项目是一个手机 App 或者你是一个 Ajax 请求,则不会有这种调整,即没写 / 就当做详细资源来看待,若是该资源不存在,就会报 404 ,写了/ 就当目录来看待。(OkHtpp3中是这样)

有的时刻我们还可能见到下面这种URI:

http://www.baidu.com/

这个和我们先容的第一种情形很类似,只是后面多了一个 / ,这个 / 示意我们要接见的是根目录,然则没有指定根目录下的文件,默认就是根目录下的 index.html 或者 default.html 。

OK,经由上面的先容,小伙伴对 URI 最后面的 **/** 已经有了清晰的熟悉了吧?这个器械不可以随意省略,有 / 和没有 / ,接见效果有可能是天壤之别。

参考资料:

  1. 《网络是怎样毗邻的》

为什么每个人都在谈论 WebAssembly

分享到 :
相关推荐

发表评论

登录... 后才能评论