Nginx Location 正则表达式与匹配优先级

目录

Nginx location 正则表达式与匹配优先级

基本语法

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
  • 默认值:-
  • 上下文:server, location

匹配符详解

1. 等号(=)- 完全匹配

表示完全匹配规则才执行操作。

location = /index {
    [ configuration A ]
}

只有 URL 为 http://{domain_name}/index 时才执行。

2. 波浪号(~)- 正则匹配,区分大小写

location ~ /page/\d{1,2} {
    [ configuration B ]
}

URL 为 http://{domain_name}/page/1/page/99 时配置生效。

3. 波浪号与星号(~*)- 正则匹配,不区分大小写

location ~* /\.(jpg|jpeg|gif) {
    [ configuration C ]
}

匹配所有以 jpg、jpeg、gif 结尾的 URL 时配置生效。

4. 脱字符与波浪号(^~)- 前缀匹配,普通字符

表示普通字符匹配,前缀匹配有效。

location ^~ /images/ {
    [ configuration D ]
}

URL 为 http://{domain_name}/images/1.gif 时配置生效。

5. @符号 - 内部重定向

定义一个 location,用于处理内部重定向。

location @error {
    proxy_pass http://error;
}
error_page 404 @error;

匹配优先级

= > ^~ > ~/~*

~/~* 中有多个正则匹配时,选择正则表达式最长的配置执行。

实战案例

配置 301 重定向到另一个域名时,发现 HTML 正常转发,但 CSS 和 JS 等静态文件均 404 错误。

问题所在:

location /301yy/ {
    proxy_pass http://node_haici/;
}

静态文件根据匹配优先级走到了后面的 location 上去了。因为 ~* 的优先级大于普通前缀匹配,所以加上 ^~ 后优先级就高于 ~* 了:

location ^~ /301yy/ {
    proxy_pass http://node_haici/;
}

这样就一并转发走了,问题解决。配置 nginx 时需要注意匹配优先级。

#nginx