详解Nginx location 匹配规则

发布时间:2019-03-05 10:06 来源:互联网 当前栏目:电脑编程入门

    本篇文章主要介绍了Nginxlocation匹配规则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
 
    语法规则
 
    location[=|~|~*|^~]/uri/{…}
 
    模式含义location=/uri=表示精确匹配,只有完全匹配上才能生效location^~/uri^~开头对URL路径进行前缀匹配,并且在正则之前。location~pattern开头表示区分大小写的正则匹配location~*pattern开头表示不区分大小写的正则匹配location/uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后location/通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default
 
    前缀匹配时,Nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~/static//aa匹配到(注意是空格)
 
    多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
 
    首先精确匹配=其次前缀匹配^~其次是按文件中顺序的正则匹配然后匹配不带任何修饰的前缀匹配。最后是交给/通用匹配当有匹配成功时候,停止匹配,按当前匹配规则处理请求
 
    注意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配:location/dir01与location/dir01/dir02,如有请求//localhost/dir01/dir02/file将最终匹配到location/dir01/dir02
 
    例子,有如下匹配规则:
 
    location=/{echo"规则A";}location=/login{echo"规则B";}location^~/static/{echo"规则C";}location^~/static/files{echo"规则X";}location~\.(gif|jpg|png|js|css)${echo"规则D";}location~*\.png${echo"规则E";}location/img{echo"规则Y";}location/{echo"规则F";}
 
    那么产生的效果如下:
 
    访问根目录/,比如//localhost/将匹配规则A访问//localhost/login将匹配规则B,//localhost/register则匹配规则F访问//localhost/static/a.html将匹配规则C访问//localhost/static/files/a.exe将匹配规则X,虽然规则C也能匹配到,但因为最大匹配原则,最终选中了规则X。你可以测试下,去掉规则X,则当前URL会匹配上规则C。访问//localhost/a.gif,//localhost/b.jpg将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而//localhost/static/c.png则优先匹配到规则C访问//localhost/a.PNG则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。访问//localhost/img/a.gif会匹配上规则D,虽然规则Y也可以匹配上,但是因为正则匹配优先,而忽略了规则Y。访问//localhost/img/a.tiff会匹配上规则Y。
 
    访问//localhost/category/id/1111则最终匹配到规则F,因为以上规则都不匹配,这个时候应该是Nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),Nginx作为反向代理服务器存在。
 
    所以实际使用中,笔者觉得至少有三个匹配规则定义,如下:
 
    #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。#这里是直接转发给后端应用服务器了,也可以是一个静态首页#第一个必选规则location=/{proxy_pass//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//tomcat:8080/}
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、