写在前面的话:
老规矩,先啰嗦几句,输出一下情绪,很久没有深夜写博文了,做了技术就是这样,深
度和广度,都需要你兼具,相信很多从业者学东西之前都先问自己一个问题,学这个有
没有用?浪费时间吗?说实话,我也是这个问题问过自己很多次。研究Nginx之前,也定
位过自己,Java研发,会配置简单的Nginx,会用。ctrl+c ctrl+v能解决很多问题
,但是出了问题还是自己解决不了。很多小伙伴会说了,不是有运维吗。。有的时候大
家的思维都是相同,说的简单一些,老子会特么的写CRUD,也不用研究什么数据结构,
算法,spring,跟我有卵关系啊。我也用不到。学以致用,确实很奇妙。现在学了还是
不一定用的到,但是用的到了,你学了你就抢先领跑了。Long life learning,恢
复博客更新啦,不啰嗦了,开始正文
Nginx Location grammer
location [=|~|~*|^~] /uri/ { … }
语法如上,说到location,先看一下这个key在配置中出现的案例
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location ^~ /api/ {
root /usr/local/nero/;
#proxy_pass ip:port/dir
error_page 404 @api_err;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
在一个配置中,location作为key提供了http或https协议匹配uri的功能,支持正则,
支持[=|~|~*|^~]几种匹配方式,当匹配到以后,选择用proxy_pass或者root做跳转
或静态资源索引。这就是location的根本作用了。
root key
root 用来匹配静态资源路径,支持绝对和安装路径索引
root html 匹配路径为 /usr/local/nginx/html (默认安装路径情况)
root /usr/local/static 绝对路径索引,匹配为/usr/local/static下的文
件。也就是说 ip:port = /usr/local/static
proxy_pass key
proxy_pass 用来转发请求,用作虚拟主机,80或者443端口复用
精确匹配 = uri
= /uri/
有且只有完整匹配的时候才会匹配成功
比如 = /api/html, 那么请求就必须是 ip:port/api/html
少一个匹配都不可以,用于特殊情况的uri
区分大小写和非区分正则匹配 ~ and ~*
~ uri 区分大小写匹配
~* uri 不区分大小写匹配
location ~* \.(html|jpg|png)$
正则匹配相关后缀案例
一般用作静态资源服务器映射匹配
一个疑问 ~ and ~*
如上文:大小写匹配到底说的哪里?
区分大小写和非区分正则匹配
~ /uri 区分
~* /uri 不区分
假设有 /html/API/QUFENUPD/1111.jpg
配置1
location ~ \.(html)$ {
root html;
index index.html;
}
配置2:
location ~* \.(html)$ {
root html;
index index.html;
}
那么访问:http://ip:port/API/QUFENUPD/1111.JPG
应该匹配到配置2的情况,而本人亲测确报错了404.
log也确实记录找的JPG路径,
难道大小写区分不是说的正则里面相应的匹配吗?
匹配开头^~
^~ uri
demo:
location ^~ /api/ {
proxy_pass ip:port/dir
}
^~ /api 那么所有 ip:port/api/* 全部匹配
一般用来做多虚拟主机映射。
总结
location 关键点还是在于正则表达式的使用,非常灵活。
持续学习吧 - -