入门
- 语法:
location [=|^~|~|~*] /url/ { ... }
=
: 绝对匹配^~
: 前缀匹配~
: 正则匹配~*
: 正则匹配(不区分大小写)!~
: 正则匹配(取反)!~*
: 正则匹配(不区分大小写, 取反)@
: 用于处理内部重定向
- 优先级: 绝对匹配(
=
) --> 前缀匹配(^~
) --> 正则匹配(~|~*|!~|!~*
) --> 不带任何修饰的匹配
关键字介绍
alias 和 root 的区别
- alias
// ***** 将匹配条件全部替换为 alias 的内容 ***** // 当你请求 http://www.a.com/x/1.jpg 时 // 实际会访问 /a/b/c/1.jpg location ^~ /x/ { alias /a/b/c/; }
- root
// 当你请求 http://www.a.com/x/2.jpg 时 // 实际会访问 /a/b/c/x/2.jpg location ^~ /x/ { root /a/b/c/; }
last 和 break 的区别
- 出现在 location 之外时
- 两者的作用是一致的没有任何差异
- 出现在location 内部时
- last: 使用了last 指令, rewrite 后会跳出location 作用域, 重新开始再走一次刚才的行为, 常用
- break: 使用了break 指令, rewrite后不会跳出location 作用域, 它的生命也在这个location中终结
permanent 和 redirect 的区别
- 状态码不同
- permanent: 永久重定向, 状态码为301
- redirect: 临时重定向, 状态码为302
匹配方式(按优先级介绍)
绝对匹配
- 不会出现同一 url 同时满足 两个绝对匹配的情况
- root 和 alias 没有区别
- 示例
# 此时访问 /xxx, 实际是访问 /mnt/xxx/ location = /xxx { root /mnt; # alias /mnt; }
前缀匹配
- 同时匹配会优先更精确的(如示例中的
/api1/static
) root
和alias
会有不同, 详见上方
介绍- 示例
# 访问 /api1 会跳转 百度 # 访问 /api1/static/ 实际上访问 /mnt/t.html # 访问 /api2/static/ 实际上访问 /mnt/api2/static/t.html location ^~ /api1 { rewrite (.*) https://www.baidu.com; } location ^~ /api1/static { alias /mnt; index t.html; } location ^~ /api2/static { root /mnt; index t.html; }
正则匹配(多用于文件名匹配或者后缀匹配)
- 同时匹配会按配置顺序生效
- 不建议使用 alias
- 示例
# 访问 xxx.png 会优先去 /mnt/xxx 目录里找 location ~ \.(gif|jpg|png|js|css)$ { root /mnt/xxx; } # 无视大小写 location ~* \.png$ { root /mnt/; }
模糊匹配
- 优先更精确
- 示例
# location /img { echo "规则Y"; } location / { echo "规则F"; }