1 location详解
1.location匹配规则
Nginx中location的作用是根据Url来决定怎么处理用户请求(转发请求给其他服务器处理或者查找本地文件进行处理)。location支持正则表达式,配置十分灵活。我们可以在一个虚拟主机(nginx中的一个server节点)下配置多个location以满足如动静分离,防盗链等需求。
location语法是: location [=|~|~*|^~] /uri/ {… },具体解释如下表:
location的匹配顺序是: = /url > ^~ /Purl > /Purl > ~ 和 ~* ,具体流程如下图所示,需要注意:一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。两种情况除外:①使用“=”,即精准匹配,如果匹配成功就立即停止其他匹配;②使用“^~”前缀,这个前缀告诉nginx ,如果匹配成功不再进行正则匹配。
简单总结:
1. 先进行精准匹配,如果匹配成功,立即返回结果并结束匹配过程。
2. 进行普通匹配,如果有多个location匹配成功,将“最长前缀”的location作为临时结果(如果是 ^~类型的普通匹配成功则直接返回结果,结束匹配过程)。
3. 由上至下逐一进行正则匹配,一旦匹配成功1个,立即返回结果,并结束解析过程;如果没有一个正则匹配成功,那么将普通匹配的最长前缀location作为最终结果返回,并结束匹配过程。
2. 实际使用建议
实际使用中,个人觉得每个虚拟主机下(server节点下)至少有三个匹配规则定义,如下: #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。 #这里是直接转发给后端应用服务器了,也可以是一个静态首页 # 第一个必选规则 location = / { proxy_pass http://tomcat:8080/index } # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项 # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用 location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } #第三个规则就是通用规则,用来转发动态请求到后端应用服务器 #非静态文件请求就默认是动态请求,自己根据实际把握 #毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了 location / { proxy_pass http://tomcat:8080/ }
实际使用建议参考自:https://segmentfault.com/a/1190000002797606
2 rewrite详解
1 rewrite简单认识
rewrite模块即ngx_http_rewrite_module模块,主要功能是实现URI重定向。rewrite模块会通过正则匹配重写URI,然后内部跳转再匹配location,或者直接做30x重定向返回客户端。Nginx的rewrite功能需要PCRE的支持,PCRE是perl兼容正则表达式库。rewrite指令的语法十分简单如下:
rewrite将符合正则的内容替换为新的替代内容
rewrite <regex> <replacement> [flag]; 关键字 正则 替代内容 flag标记 正 则: perl兼容正则表达式语句进行规则匹配 替代内容: 将正则匹配的内容替换成replacement flag标记: rewrite支持的flag标记 ------------------------------------------------------------------------------- flag标记说明: last #匹配完成后不再匹配当前环境下的其他rewrite指令,开始匹配新的location URI规则 break #匹配完成即终止,不再匹配后面的任何规则 redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
使用rewrite时也会用到,几个常用的指令汇总如下:
一个简单的栗子,简单了解下rewrite:
server{ listen 80; server_name www.mysite.com; #在server中调转到 爱奇艺 #rewrite ^/(.*) https://www.iqiyi.com break; location = /{ #location中跳转到百度 rewrite ^/(.*) http://www.baidu.com; root html; index index.html; } #日志记录 error_log logs/mysite.error.log error; access_log logs/mysite.access.log main; }
我们知道默认情况访问nginx的虚拟主机会展示nginx的欢迎界面,我们通过rewrite指令跳转到百度。输入虚拟机的IP,访问结果不再是nginx欢迎页,而是302跳转到百度如下:
2 rewrite的执行过程
server{ listen 80; server_name www.mysite.com; location = /{ #跳转到百度 rewrite ^/(.*) http://www.baidu.com; #跳转到/test1 rewrite ^/(.*) /test1; #跳转到/test2 rewrite ^/(.*) /test2; root html; index index.html; } location /test1{ return 401; } location /test2{ return 402; } #日志记录 error_log logs/mysite.error.log error; access_log logs/mysite.access.log main; }
server进行上边的配置时,我们访问虚拟机IP 192.168.70.132,会跳转到百度页面,因为replacement包含了http协议名,不在执行后续的rewrite指令;
如果把第一个rewrite注释掉,会调整到402错误页,因为rewrite的最终结果时以最后一个匹配成功的为准,最后匹配到 rewite /test2指令,然后找到location /test2返回402错误码;
如果我们在rewrite ^?(.*) /test1后边加上last标记 ,表示不再匹配后边的rewrite,会跳到401错误页,url不变还是http://192.168.70.132;
如果我们在rewrite ^?(.*) /test1后边加上redirect 或者 permanent 标记 ,表示不再匹配后边的rewrite,会跳转到401错误页(redirect的跳转码为302,permanet的跳转码时301),url会改变成 http://192.168.70.132/test1;
如果我们在rewrite ^?(.*) /test1后边加上break标记 ,表示不再匹配任何规则,会跳转到404错误页;因为break标记不会再执行任何规则,所以不会再去找location test1,而是直接找 html/test1资源,所以出现404错误。
3 一些常用的全局变量
这里列举几个rewrite的简单栗子来帮助理解:
server{ listen 80; server_name localhost; location /{ #如果客户端IP是192.168.70.1,那么拒接响应 if ($remote_addr = 192.168.70.1){ return 403; } root html; index index.html; } }
通过IP为192.168.70.1的电脑去访问时,结果如下:
#如果是google访问的,重定向到 html/chrome.html页面 location /{ if ($http_user_agent ~ Chrome){ rewrite ^.*$ /chrome.html; break; } root html; index index.html; }
③ 文件不存在返回404,写的比较繁琐,主要是演示rewrite的用法
server{ listen 80; server_name www.mysite.com; location /{ #如果文件不存在,跳转到notfound, if (!-f /usr/local/nginx/html/aaa.html){ rewrite ^/(.*) /notfound ; } root html; index index.html; } location ~ /notfound { return 404; } error_log logs/mysite.error.log error; access_log logs/mysite.access.log main; }
小结:loaction和rewrite是nginx中最核心的指令,通过location和rewrite我们可以实现动静分离/规范客户端url等功能,因为支持perl的正则表达式,用法十分灵活。这里简单做了一些总结,如果有不正确的地方请指出。
【1】https://www.cnblogs.com/coder-yoyo/p/6346595.html
【2】https://www.cnblogs.com/czlun/articles/7010604.html
【3】https://www.cnblogs.com/crazylqy/p/6892010.html