nginx location 优先级

作者:杨润炜
日期:2016/2/18 14:35

location匹配命令概述

A location can either be defined by a prefix string, or by a regular expression.

location匹配命令包括前缀和正则表达式两种。具体有如下几种匹配命令:

~

波浪线表示执行一个正则匹配,区分大小写

~*

表示执行一个正则匹配,不区分大小写

^~

匹配路径的前缀,如果找到,停止搜索。
表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录

=

进行普通字符精确匹配

@

“@” 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

location优先级

=(精确匹配) > ^~(特殊路径前缀匹配) > ~*(正则匹配) = ~(正则匹配) > 普通路径前缀匹配

示例1

=(精确匹配) > ^~(特殊路径前缀匹配)

  1. loaction ^~ /admin {
  2. [ configuration A ]
  3. }
  4. loaction = /admin {
  5. [ configuration B ]
  6. }

结果:/admin匹配进 [ configuration B ]

示例2

^~(路径的前缀匹配) > ~*(正则匹配) = ~(正则匹配)

  1. loaction ~* ^/admin {
  2. [ configuration A ]
  3. }
  4. loaction ~ ^/admin {
  5. [ configuration B ]
  6. }
  7. loaction ^~ /admin {
  8. [ configuration C ]
  9. }

结果:/admin匹配进 [ configuration C ]

示例3

按特殊路径前缀匹配匹配时,前缀越具体(越长)则优先匹配。

  1. loaction ^~ /admin {
  2. [ configuration A ]
  3. }

结果:/admin/a匹配进 [ configuration A ]

  1. loaction ^~ /admin {
  2. [ configuration A ]
  3. }
  4. loaction ^~ /admin/a {
  5. [ configuration B ]
  6. }

结果:/admin/a匹配进 [ configuration B ]

示例4

正则匹配是按照配置时定义的顺序来匹配的,先匹配到的就停止。

  1. loaction ~* ^/admin {
  2. [ configuration A ]
  3. }
  4. loaction ~ ^/admin {
  5. [ configuration B ]
  6. }

结果:/admin匹配进 [ configuration A ]

示例5

按普通路径前缀匹配时,也是前缀越具体(越长)则优先匹配

  1. loaction /admin {
  2. [ configuration A ]
  3. }

结果:/admin/a匹配进 [ configuration A ]

  1. loaction /admin {
  2. [ configuration A ]
  3. }
  4. loaction /admin/a {
  5. [ configuration B ]
  6. }

结果:/admin/a匹配进 [ configuration B ]

官方文档示例

  1. location = / {
  2. [ configuration A ]
  3. }
  4. location / {
  5. [ configuration B ]
  6. }
  7. location /documents/ {
  8. [ configuration C ]
  9. }
  10. location ^~ /images/ {
  11. [ configuration D ]
  12. }
  13. location ~* \.(gif|jpg|jpeg)$ {
  14. [ configuration E ]
  15. }

结果1: /匹配进[ configuration A ]
结果2: /index.html匹配进[ configuration B ]
结果3: /documents/document.html匹配进[ configuration C ]
结果4: /images/1.gif匹配进[ configuration D ]
结果5: /documents/1.jpg匹配进[ configuration E ]

分析

结果1说明=(精确匹配优先级最高);
结果2及结果3说明前缀匹配时,前缀越具体(越长)则优先匹配;
结果4及结果5说明^~(路径的前缀匹配)优先级高于 ~*(正则匹配)。

规则总结

  1. =(精确匹配) > ^~(特殊路径前缀匹配) > ~*(正则匹配) = ~(正则匹配) > 普通路径前缀匹配
  2. 正则匹配按配置顺序匹配
  3. 前缀匹配越具体(越长)则优先匹配

参考

nginx-location文档

感谢您的阅读!
如果看完后有任何疑问,欢迎拍砖。
欢迎转载,转载请注明出处:http://www.yangrunwei.com/a/28.html
邮箱:glowrypauky@gmail.com
QQ: 892413924