语法规则: location [=|~|~*|^~] /uri/ { … }

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头

~ 开头表示区分大小写的正则匹配 以xx结尾
~*
开头表示不区分大小写的正则匹配 以xx结尾
!~!~*
分别为区分大小写不匹配及不区分大小写不匹配 的正则
/
通用匹配, 任何请求都会匹配到**

匹配规则优先级

首先 精确匹配 = —>> 其次以xx开头匹配 ^~ —>> 然后是按文件中顺序的正则匹配 —>> 最后是交给 / 通用匹配。

**

= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。

普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。

^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。

最后匹配理带有”~”和”~*”的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用

当有匹配成功时候,停止匹配,按当前匹配规则处理请求

  1. location = / {
  2. #规则A
  3. }
  4. location = /login {
  5. #规则B
  6. }
  7. location ^~ /static/ {
  8. #规则C
  9. }
  10. location ~ \.(gif|jpg|png|js|css)$ {
  11. #规则D,注意:是根据括号内的大小写进行匹配。括号内全是小写,只匹配小写
  12. }
  13. location ~* \.png$ {
  14. #规则E
  15. }
  16. location !~ \.xhtml$ {
  17. #规则F
  18. }
  19. location !~* \.xhtml$ {
  20. #规则G
  21. }
  22. location / {
  23. #规则H
  24. }
  25. 那么产生的效果如下:
  26. 访问根目录/, 比如http://localhost/ 将匹配规则A
  27. 访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
  28. 访问 http://localhost/static/a.html 将匹配规则C
  29. 访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C
  30. 访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
  31. 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,
  32. http://localhost/a.XHTML不会匹配规则G,(因为!)。规则F,规则G属于排除法,符合匹配规则也不会匹配到,所以想想看实际应用中哪里会用到。
  33. 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。