背景
最近在使用nginx搭建网站或前后端分离部署项目时遇到了一个疑惑,就是在浏览器中请求url时,最后一个反斜杠作用到底是什么?
参阅了网上的文章,记录一下
https://blog.csdn.net/bruce_6/article/details/82219522
https://blog.csdn.net/sosous/article/details/48784927
https://blog.csdn.net/u010525694/article/details/78591355
解释
有没有反斜杠的意义在于该url是指向一个文件还是一个目录,说明url地址是精准表达指向的,有无'/'代表的是两个不同的地址
。
例如:
http://kayosite.com/fxg 指向的是网站根目录下一个名为fxg的文件
http://kayosite.com/fxg/ 指向的是网站根目录下一个名为fxg的目录
对于服务器来说,如果访问的是目录,则会根据规则访问该目录下的默认文件(index.html、index.htm之类)如nginx中index指令
。如访问/fxg/服务器会寻找/fxg/index.html文件(nginx里location中root/alias指令对应目录)
,而访问/fxg服务器则会寻找/fxg文件。
对于用户来说,在大多数情况下这两个网址没有任何区别,他们访问的都是网站 fxg 目录下的默认首页。一般用户也都知道最后一个斜杠是可有可无的,他们输入网址的时候一般都只会输入 http://kayosite.com/fxg。
当 Web 服务器接收到某个末尾不含斜杠的 url 请求时,例如 http://kayosite.com/fxg,这时服务器会搜索网站根目录下有没有名为 fxg 的文件,如果没有就把 fxg 当做目录处理,此时服务器会执行301永久重定向处理将/fxg重定向到/fxg/目录
,然后返回 fxg 目录下的默认首页。
注意:在nginx中如果使用非80端口重定向时会出现301丢失端口问题,这个后面文档单独解释
浏览器自动添加末尾斜杠(/)
当我们访问一个网址时,例如www.xxx.com,此时浏览器会自动帮我们添加上后面的斜杠(/)注意:有些浏览器会自动隐藏/,例如:chrome
。
这是因为,访问请求必须从"/"开始,即使是裸url,浏览器此时替我们做了正确的修正,在url后面自动的加上了"/"从而能正确访问。
所有主流浏览器在请求裸域URL(即首页)时都会对HTTP请求 “加斜杠” 。为了使HTTP请求有效,这实际上是必需的,其原因如下:
http://example.com/
----------------------------------
GET / HTTP/1.1
Host: example.com
请注意/
第一行中的(斜杠)-这是所请求的URL。这里什么都没有是无效的。从RFC 2616开始:
请注意,绝对路径不能为空;如果原始URI中没有任何内容,则必须将其指定为“ /”(服务器根目录)。
你可以查看浏览器向服务器发出的HTTP请求。显示在“浏览器状态栏”中的URL,甚至地址栏中的URL可能因浏览器不同而不同。谷歌Chrome并不会追加在状态栏最后的斜线,虽然斜线是存在的。
如果指定http://example.com
(无斜杠),此时不会发生301重定向,因为浏览器会在发出HTTP请求之前先对其进行了修正。
请注意,这与URL中存在路径/目录时(http://xxx.com/yyy)
在URL末尾添加斜杠不同。如果您请求http://example.com/directory
(不使用斜杠),此时浏览器不会自动添加一个斜杠,大多数服务器如果找不到该文件则将301重定向到http://example.com/directory/
(斜杠)目录进行加载。