nginx访问静态资源的相关配置

nginx访问静态资源的相关配置
nginx访问静态资源的相关配置
引⾔
需要通过nginx服务读取静态⽂件,需要配置f的相关配置,如虚拟主机配置server、location配置。
其实f的配置⽂件是由指令集组成的,指令集分为:简单指令、模块指令。
简单的指令由名字和参数组成,中间⽤空格隔开,末尾⽤分号(;)结尾。
模块指令和简单指令有着相同的结构,但是末尾的分号(;)改为了花括号({})如果模块指令中含有其它的模块指令,那么该模块指令就叫做上下⽂(context),⽐如http模块指令、server模块指令。
1、server模块指令
server模块指令是nginx⽤来配置虚拟主机的
什么是虚拟主机?
pic-1590651964374.png
server模块指令中有三个重要的指令:listen 监听端⼝号,server_name 服务名,location映射解析⽂件地址
pic-1590651964375.png
2、location模块指令
向server模块指令添加location模块指令如下:
location / {
root ⽂件地址
}
如下:
pic-1590651964376.png
解释这段指令:
(1)⼀个⽬录可以对应多个location指令集
这样的话,⼀个⽂件的⽬录可以写成多个location指令进⾏匹配,因为最后访问的话是根据root指令集所指的地址加上 location指定的uri拼接的
就拿上⾯E:\javaWork\XXXX\0521\html\23\24这个⽬录通过root指令对应的的地址和location指定的uri拼接能够得到的⽅式有:(举⼏种,不举全)(1)root E:\javaWork\XXXX\0521; location \html\23\24;(2)root E:\javaWork\XXXX\0521\html; location \23\24;(3)root
E:\javaWork\XXXX\0521\html\23; location \24;
如果server指令集写的端⼝是8084,server_name是localhost。
那么上⾯的三种root指令集对应的地址和location对应的uri拼接情况,可以通过以下三种⽅式取到 \24 ⽬录下对应的静态⽂件。
1
2
滚珠花键3
(2)优先更全的uri匹配原则(精确匹配原则)
如果两个不同的⽬录有以下两个location指令对应
标志验证
1
2
这时,如果在浏览器地址栏访问localhost:8084/0521/doc/hello.html (1)假设E:/java/jvm/0521⽬录下有doc⽂件夹,并且⾥⾯有hello.html静态⽂件。
(2)假设D:/java/gc/0521/doc⽬录下,有hello.html静态⽂件。
这⼀步是不是给弄懵逼了?请求的uri符合这两个location指令的匹配,那么具体匹配哪⼀个呢?
那就是按照精确匹配原则,哪个location对应的uri更加和请求的uri精确,那么就匹配哪个location指令集。也就是说,在上⾯那个问题中,会匹配第⼆个location 指令集。
证明上⾯结论:
(1)创建测试⽂件
D盘符⽂件,及hello.html内容:
pic-1590651964378.png
E盘符⽂件,及hello.html内容:
pic-1590651964380.png
(2)给f增加两个location指令集
pic-1590651964382.png延时开关电路
(3)重新加载f配置⽂件
(4)浏览器地址栏访问:localhost:8084/0521/doc/hello.html
对吧?匹配的就是指向D盘的那个location。如果所匹配的location并不是你所期望的那样或者诸如此类的其它问题,那么你可以去查看logs⽬录下的error.log和access.log这两个⽇志⽂件。
pic-1590651964384.png
(3)⼀个请求始终只匹配最精确的location
柴油脱剂到这⾥,再抛出⼀个问题,接着上⾯的操作,精确匹配确实是匹配到了指向D盘的location,那么,如果我要匹配的⽂件在doc⽬录下,并没有呢?nginx 会对浏览器发出的请求如何处理,是直接抛出404吗?
我们可以尝试着将第⼆个location对应的⽬录下的hello.html进⾏删除,再去访问localhost:8084/0521/doc/hello.html;看看是否会访问E盘下的hello.html平板电视支架
结果显然,并不会去匹配第⼀个映射E盘的location,也就是说,如果uri已经匹配到当前这个精确location的话,那么如果没有需要访问的⽂件,那么直接抛出404,⽽不会去继续匹配其它的不精确的location。
(4)额外注意
这段话是个⼈总结的,⽹上没见着相关结论。
面包炉location的映射⽂件地址是root对应地址加上location的uri。(E:\javaWork\XXXX\0521\html\23\24)如果要访问这个地址
(E:\javaWork\XXXX\0521\html\23\24)的前⼀层或前⼏层⽬录下的⽂件,那么只能通过匹配另外的location。并不能通过相对路径(..)的形式访问到。我们让⼀个⽂件地址匹配两个location指令,如下图:
(1)匹配的第⼀个location,这个location的⽂件映射地址是:E:\javaWork\XXX\0521\html
(2)匹配的第⼆个location,这个location的⽂件映射地址是:E:\javaWork\XXX\0521\html\static\html\self_test
我们可以看见页⾯报错了,是由于页⾯⽤到的jquery没有正确引⼊。
这是为什么?因为磁盘上没有吗?可是第⼀个location映射⽂件地址是可以的,所以显然并不是这个原因。这是因为nginx通过这个location,只读取了E:\javaWork\XXX\0521\html\static\html\self_test⽬录下的⽂件进来。⽽jquery⽂件,并不在这个⽬录下。也就是说,nginx只会读取location映射的⽂件地址下的所有⽂件,除此⽬录外的⽂件⼀律获取不到。
参考资料
(1)
(2)

本文发布于:2024-09-24 17:08:43,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/210523.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指令   匹配   地址   访问   模块   配置   对应
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议