|
| 1 | +### location尽可能的精确 |
| 2 | + |
| 3 | +> 解释说明 |
| 4 | +
|
| 5 | +精确的`location`匹配通常被用来加快选择过程,匹配通过后立即结束算法的执行。 |
| 6 | + |
| 7 | +使用`=`修饰符可以定义`URI`和`location`的精确匹配。它的处理速度非常快,可以节省大量的`CPU`开销。 |
| 8 | + |
| 9 | +```nginx configuration |
| 10 | +location = / { |
| 11 | +
|
| 12 | + ... |
| 13 | +
|
| 14 | +} |
| 15 | +
|
| 16 | +# Matches the query /v9 only and stops searching: |
| 17 | +location = /v9 { |
| 18 | +
|
| 19 | + ... |
| 20 | +
|
| 21 | +} |
| 22 | +
|
| 23 | +... |
| 24 | +``` |
| 25 | + |
| 26 | +如果找到精确匹配,则搜索终止。 例如,存在`/`请求,并且请求的频率比较高,则可以定义`location = /`加快这些请求的处理速度。 |
| 27 | + |
| 28 | +### 关于nginx location匹配顺序 |
| 29 | + |
| 30 | +**例子来源以下地址** |
| 31 | + |
| 32 | +[https://github.com/trimstray/nginx-admins-handbook#introduction](https://github.com/trimstray/nginx-admins-handbook#introduction) |
| 33 | + |
| 34 | +> 假设配置如下 |
| 35 | +
|
| 36 | +```nginx configuration |
| 37 | +server { |
| 38 | +
|
| 39 | + listen 80; |
| 40 | + server_name xyz.com www.xyz.com; |
| 41 | + |
| 42 | + location ~ ^/(media|static)/ { |
| 43 | + root /var/www/xyz.com/static; |
| 44 | + expires 10d; |
| 45 | + } |
| 46 | + |
| 47 | + location ~* ^/(media2|static2) { |
| 48 | + root /var/www/xyz.com/static2; |
| 49 | + expires 20d; |
| 50 | + } |
| 51 | + |
| 52 | + location /static3 { |
| 53 | + root /var/www/xyz.com/static3; |
| 54 | + } |
| 55 | + |
| 56 | + location ^~ /static4 { |
| 57 | + root /var/www/xyz.com/static4; |
| 58 | + } |
| 59 | + |
| 60 | + location = /api { |
| 61 | + proxy_pass http://127.0.0.1:8080; |
| 62 | + } |
| 63 | + |
| 64 | + location / { |
| 65 | + proxy_pass http://127.0.0.1:8080; |
| 66 | + } |
| 67 | + |
| 68 | + location /backend { |
| 69 | + proxy_pass http://127.0.0.1:8080; |
| 70 | + } |
| 71 | + |
| 72 | + location ~ logo.xcf$ { |
| 73 | + root /var/www/logo; |
| 74 | + expires 48h; |
| 75 | + } |
| 76 | + |
| 77 | + location ~* .(png|ico|gif|xcf)$ { |
| 78 | + root /var/www/img; |
| 79 | + expires 24h; |
| 80 | + } |
| 81 | + |
| 82 | + location ~ logo.ico$ { |
| 83 | + root /var/www/logo; |
| 84 | + expires 96h; |
| 85 | + } |
| 86 | + |
| 87 | + location ~ logo.jpg$ { |
| 88 | + root /var/www/logo; |
| 89 | + expires 48h; |
| 90 | + } |
| 91 | +} |
| 92 | +``` |
| 93 | + |
| 94 | +> 匹配规则如下 |
| 95 | +
|
| 96 | +| 请求URL | 相匹配的location | 最终匹配 | |
| 97 | +|---------------------|-------------------------------------------------------------------------------------------------------------------|---------------------------| |
| 98 | +| / | 1\) prefix match for / | / | |
| 99 | +| /css | 1\) prefix match for / | / | |
| 100 | +| /api | 1\) exact match for /api | /api | |
| 101 | +| /api/ | 1\) prefix match for / | / | |
| 102 | +| /backend | 1\) prefix match for /2\) prefix match for /backend | /backend | |
| 103 | +| /static | 1\) prefix match for / | / | |
| 104 | +| /static/header\.png | 1\) prefix match for /2\) case sensitive regex match for ^/\(media\|static\)/ | ^/\(media\|static\)/ | |
| 105 | +| /static/logo\.jpg | 1\) prefix match for /2\) case sensitive regex match for ^/\(media\|static\)/ | ^/\(media\|static\)/ | |
| 106 | +| /media2 | 1\) prefix match for /2\) case insensitive regex match for ^/\(media2\|static2\) | ^/\(media2\|static2\) | |
| 107 | +| /media2/ | 1\) prefix match for /2\) case insensitive regex match for ^/\(media2\|static2\) | ^/\(media2\|static2\) | |
| 108 | +| /static2/logo\.jpg | 1\) prefix match for /2\) case insensitive regex match for ^/\(media2\|static2\) | ^/\(media2\|static2\) | |
| 109 | +| /static2/logo\.png | 1\) prefix match for /2\) case insensitive regex match for ^/\(media2\|static2\) | ^/\(media2\|static2\) | |
| 110 | +| /static3/logo\.jpg | 1\) prefix match for /static32\) prefix match for /3\) case sensitive regex match for logo\.jpg$ | logo\.jpg$ | |
| 111 | +| /static3/logo\.png | 1\) prefix match for /static32\) prefix match for /3\) case insensitive regex match for \.\(png\|ico\|gif\|xcf\)$ | \.\(png\|ico\|gif\|xcf\)$ | |
| 112 | +| /static4/logo\.jpg | 1\) priority prefix match for /static42\) prefix match for / | /static4 | |
| 113 | +| /static4/logo\.png | 1\) priority prefix match for /static42\) prefix match for / | /static4 | |
| 114 | +| /static5/logo\.jpg | 1\) prefix match for /2\) case sensitive regex match for logo\.jpg$ | logo\.jpg$ | |
| 115 | +| /static5/logo\.png | 1\) prefix match for /2\) case insensitive regex match for \.\(png\|ico\|gif\|xcf\)$ | \.\(png\|ico\|gif\|xcf\)$ | |
| 116 | +| /static5/logo\.xcf | 1\) prefix match for /2\) case sensitive regex match for logo\.xcf$ | logo\.xcf$ | |
| 117 | +| /static5/logo\.ico | 1\) prefix match for /2\) case insensitive regex match for \.\(png\|ico\|gif\|xcf\)$ | \.\(png\|ico\|gif\|xcf\)$ | |
| 118 | + |
| 119 | + |
| 120 | +> 匹配顺序说明 |
| 121 | +
|
| 122 | +`nginx根据uri进行最优匹配`: |
| 123 | + |
| 124 | + |
| 125 | +- 基于前缀的`nginx` `location`匹配(没有正则表达式): 每个`location`都将根据请求`URI`进行检查 |
| 126 | +- `nginx`搜索精确的匹配: 如果=修饰符与请求`URI`完全匹配,则立即选择此特定位置块 |
| 127 | +- 如果没有找到精确的位置块(即没有相应的=修饰符),`nginx`将继续使用非精确的前缀。它从这个`URI`的最长匹配前缀位置开始,方法如下: |
| 128 | + - 如果最长匹配前缀`location`有`^~`修饰符,`nginx`将立即停止搜索并选择该`location` |
| 129 | + - 假设最长匹配前缀`location`不使用`^~`修饰符,匹配将被临时存储,并继续执行 |
| 130 | + - 一旦选择并存储了最长匹配前缀`location`,`nginx`就会继续计算区分大小写和不敏感的正则表达式`location`。 |
| 131 | +第一个匹配`URI`的正则表达式`location`将立即被选中来处理请求 |
| 132 | + - 如果没有找到匹配请求`URI`的正则表达式`location`,则选择先前存储的前缀`location`来服务请求 |
| 133 | + |
| 134 | +**最长匹配解释说明:** |
| 135 | +请求为`/a/b/c/d`时,`location A`与`location B`中`location B`为最长匹配 |
| 136 | + |
| 137 | +- `location A` |
| 138 | +```nginx configuration |
| 139 | +location /a { |
| 140 | + ... |
| 141 | +} |
| 142 | +``` |
| 143 | + |
| 144 | +- `location B` |
| 145 | +```nginx configuration |
| 146 | +location /a/b/c { |
| 147 | + ... |
| 148 | +} |
| 149 | +``` |
0 commit comments