网站URL双斜杠的隐藏秘密
你打开浏览器在地址栏里敲下一个网址。https://www.google.com看到那两个斜杠了吗就夹在https:和www中间的那对//。你每天都在看它复制它粘贴它。但你大概从来没停下来想过这两道杠到底是干什么的。咱们把一个完整的网址拆开看看。https://www.example.com/path/to/pagehttps是协议告诉浏览器用什么方式去请求资源。www.example.com是主机名告诉浏览器去找哪台服务器。/path/to/page是路径告诉服务器你具体要哪个东西。那//呢在 URI 的规范里RFC 3986//后面跟着的部分叫 authority翻译过来就是「谁来响应你这个请求」。//是它的开头标记用来把协议名和主机名隔开。你可以把它想成一个路标。路标本身不是目的地但它告诉你从这里开始后面写的是服务器的名字了。问题在于这个路标不是非它不可。1989 年Tim Berners-Lee 在 CERN 设计 URL 语法。路径部分的斜杠/直接照搬了 Unix 的文件路径写法这很自然用过 Unix 的人一看就懂。但//这个双斜杠不是他自己想出来的。他从一台叫 Apollo Domain 的工作站上抄来的。Apollo 是 1980 年代的一款高端工作站。它的操作系统有个在当时很前沿的能力可以直接在文件路径里访问网络上其他机器的文件不用额外装什么传输工具。语法长这样//machine_name/path/to/file两个斜杠开头后面跟机器名再接文件路径。双斜杠的作用是告诉系统「注意这不是本地目录是另一台机器」。Berners-Lee 在 CERN 接触过这种工作站觉得这个写法挺清楚的就直接搬过来用了。他自己后来也说过这件事原话是「I just copied Apollo」。于是http://后面那两个斜杠就这么定下来了。你可能会问那不用//行不行完全可以。你看mailto:someoneexample.com这也是一个合法的 URI没有//。因为发邮件不需要去找一台服务器邮件地址本身就够了。tel:8613800138000打电话也没有。你可以在浏览器里敲这个号码浏览器会直接呼叫你的电话应用。data:text/html,h1Hello/h1更极端。你可以把这行直接粘到浏览器地址栏试试。浏览器会渲染出一个大标题。整个「网页」就是这行地址本身没有服务器没有网络请求。再试这个data:text/html,marqueehello world/marquee四个字在屏幕上滚来滚去。marquee是上古时代的 HTML 标签W3C 早就不推荐了但浏览器到今天还认它。一个被标准抛弃了二十年的标签靠一行 URL 复活了。还有更离谱的data:text/html,input typecolor你会看到一个颜色选择器凭空冒出来。一个可以点击、可以交互的完整控件藏在一行 URL 里背后什么都没有。你可能还听说过javascript:开头的地址可以直接在浏览器里跑代码。不过现代浏览器已经不让你从地址栏粘贴javascript:了手动敲可以粘贴会被吞掉。浏览器怕你被人忽悠着粘一段恶意脚本进去。规律到这里就很清楚了。需要找服务器的协议才有//HTTP 有FTP 有SSH 有。不需要的mailto 没有tel 没有data 没有javascript 也没有。//不是 URI 的默认配置而是「我要连一台机器」时才亮的信号灯。再看一个更逗的file:///Users/xxx/Desktop/test.html。数一下三个斜杠。前两个是//标记 authority 的位置。但本地文件没有远程服务器authority 是空的//后面直接接上了路径开头的/。三道杠挤在一起看着有点滑稽语法上却完全正确。就好像你写了一个「收件人」但后面跟的是你自己家地址。前端开发的同学可能还见过一种更骚的写法script src//cdn.jquery.com/jquery.min.js/scriptURL 开头直接就是//连协议名都没有。浏览器看到这种写法会自动继承当前页面的协议页面是 HTTPS 就用 HTTPS 请求页面是 HTTP 就用 HTTP。这个技巧在 2010 年前后很流行当时很多网站在 HTTP 和 HTTPS 之间来回切写死协议容易出问题。现在基本见不到了全世界都上了 HTTPS。但这种写法能存在恰恰说明//在 URI 语法里的角色有多独立。它不依附于任何协议名只做一件事宣告「后面是服务器」。有意思的是现在大多数浏览器已经不显示https://了。Chrome 藏了Safari 也藏了。你盯着地址栏看只能看到一个干净的域名。想看完整的 URL需要单独设置。当年 Berners-Lee 道歉说这两个字符浪费了太多纸和墨水。他大概没想到最后的解法不是从规范里删掉它们而是在界面上假装它们不存在。你打开浏览器在地址栏里敲下一个网址。https://www.google.com看到那两个斜杠了吗就夹在https:和www中间的那对//。你每天都在看它复制它粘贴它。但你大概从来没停下来想过这两道杠到底是干什么的。咱们把一个完整的网址拆开看看。https://www.example.com/path/to/pagehttps是协议告诉浏览器用什么方式去请求资源。www.example.com是主机名告诉浏览器去找哪台服务器。/path/to/page是路径告诉服务器你具体要哪个东西。那//呢在 URI 的规范里RFC 3986//后面跟着的部分叫 authority翻译过来就是「谁来响应你这个请求」。//是它的开头标记用来把协议名和主机名隔开。你可以把它想成一个路标。路标本身不是目的地但它告诉你从这里开始后面写的是服务器的名字了。问题在于这个路标不是非它不可。1989 年Tim Berners-Lee 在 CERN 设计 URL 语法。路径部分的斜杠/直接照搬了 Unix 的文件路径写法这很自然用过 Unix 的人一看就懂。但//这个双斜杠不是他自己想出来的。他从一台叫 Apollo Domain 的工作站上抄来的。Apollo 是 1980 年代的一款高端工作站。它的操作系统有个在当时很前沿的能力可以直接在文件路径里访问网络上其他机器的文件不用额外装什么传输工具。语法长这样//machine_name/path/to/file两个斜杠开头后面跟机器名再接文件路径。双斜杠的作用是告诉系统「注意这不是本地目录是另一台机器」。Berners-Lee 在 CERN 接触过这种工作站觉得这个写法挺清楚的就直接搬过来用了。他自己后来也说过这件事原话是「I just copied Apollo」。于是http://后面那两个斜杠就这么定下来了。你可能会问那不用//行不行完全可以。你看mailto:someoneexample.com这也是一个合法的 URI没有//。因为发邮件不需要去找一台服务器邮件地址本身就够了。tel:8613800138000打电话也没有。你可以在浏览器里敲这个号码浏览器会直接呼叫你的电话应用。data:text/html,h1Hello/h1更极端。你可以把这行直接粘到浏览器地址栏试试。浏览器会渲染出一个大标题。整个「网页」就是这行地址本身没有服务器没有网络请求。再试这个data:text/html,marqueehello world/marquee四个字在屏幕上滚来滚去。marquee是上古时代的 HTML 标签W3C 早就不推荐了但浏览器到今天还认它。一个被标准抛弃了二十年的标签靠一行 URL 复活了。还有更离谱的data:text/html,input typecolor你会看到一个颜色选择器凭空冒出来。一个可以点击、可以交互的完整控件藏在一行 URL 里背后什么都没有。你可能还听说过javascript:开头的地址可以直接在浏览器里跑代码。不过现代浏览器已经不让你从地址栏粘贴javascript:了手动敲可以粘贴会被吞掉。浏览器怕你被人忽悠着粘一段恶意脚本进去。规律到这里就很清楚了。需要找服务器的协议才有//HTTP 有FTP 有SSH 有。不需要的mailto 没有tel 没有data 没有javascript 也没有。//不是 URI 的默认配置而是「我要连一台机器」时才亮的信号灯。再看一个更逗的file:///Users/xxx/Desktop/test.html。数一下三个斜杠。前两个是//标记 authority 的位置。但本地文件没有远程服务器authority 是空的//后面直接接上了路径开头的/。三道杠挤在一起看着有点滑稽语法上却完全正确。就好像你写了一个「收件人」但后面跟的是你自己家地址。前端开发的同学可能还见过一种更骚的写法script src//cdn.jquery.com/jquery.min.js/scriptURL 开头直接就是//连协议名都没有。浏览器看到这种写法会自动继承当前页面的协议页面是 HTTPS 就用 HTTPS 请求页面是 HTTP 就用 HTTP。这个技巧在 2010 年前后很流行当时很多网站在 HTTP 和 HTTPS 之间来回切写死协议容易出问题。现在基本见不到了全世界都上了 HTTPS。但这种写法能存在恰恰说明//在 URI 语法里的角色有多独立。它不依附于任何协议名只做一件事宣告「后面是服务器」。有意思的是现在大多数浏览器已经不显示https://了。Chrome 藏了Safari 也藏了。你盯着地址栏看只能看到一个干净的域名。想看完整的 URL需要单独设置。当年 Berners-Lee 道歉说这两个字符浪费了太多纸和墨水。他大概没想到最后的解法不是从规范里删掉它们而是在界面上假装它们不存在。