date: 2020-06-29title: nginx location匹配规则 #标题
tags: nginx匹配规则 #标签
categories: nginx # 分类

记录下nginx location的匹配规则。

location匹配

  1. location [=|~|~*|^~|@] /uri/ {
  2. ...
  3. }
  • =:表示精确匹配后面的url;
  • ~:表示正则匹配,但是区分大小写;
  • ~*:表示正则匹配,不区分大小写;
  • ^~:表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配其他选项,一般用于匹配目录;
  • @:“@”定义一个命名的location,使用在内部定向时,例如 error_page。这样的location不用于常规请求处理,而是用于请求重定向。

上述匹配规则的优先匹配顺序:

  • =前缀的指令严格匹配这个查询。如果找到,则停止搜索。
  • [空格] 前缀匹配,匹配后,继续更长前缀匹配和正则匹配。
  • ^~ 非正则匹配,匹配该规则后,停止继续正则匹配。
  • ~ 区分大小写的正则匹配,按顺序匹配,一旦匹配上即停止后续匹配。
  • ~* 不区分大小写的匹配,一旦匹配即停止后续匹配。

url匹配

在nginx中配置proxy_pass时,当在后面url加上了/,相当于时绝对根路径,则nginx不会把location中匹配的路径部分给代理走,如果没有/,则会把匹配的路径部分也给代理走。

模糊匹配

没有/时,localtion /ljz/test

可以匹配/ljz/test请求,也可以匹配/ljz/test/xxx等。

而有/时,localtion /ljz/test/

不能匹配/ljz/test请求,只能匹配/ljz/test/xxx这样的请求。

匹配举例

访问url如下:

  1. $ http://192.168.20.3/proxy/test.html

第一种location规则
  1. location /proxy/ {
  2. set $X_test 'match location'; # 稍后我会解释这个set指令
  3. proxy_pass http://192.168.20.3/;
  4. }

按照上述配置会代理到:http://192.168.20.3/test.html。

第二种location规则

  1. # 此规则比起第一个来,最后少了个 /
  2. location /proxy/ {
  3. set $X_test 'match location';
  4. proxy_pass http://192.168.20.3;
  5. }

此规则会代理到:http://192.168.20.3/proxy/test.html。

第三种规则匹配
  1. location /proxy/ {
  2. set $X_test 'match location';
  3. proxy_pass http://192.168.20.3/merchant/;
  4. }

此规则会代理到:http://192.168.20.3/merchant/test.html。

第四种规则匹配
  1. location /proxy/ {
  2. set $X_test 'match location';
  3. proxy_pass http://192.168.20.3/merchant;
  4. }
  5. # 相对于第三种,最后少一个/。

此规则会代理到:http://192.168.20.3/merchanttest.html。

location调试技巧——set

set指令在nginx中是用来设置变量的,在我们进行location规则匹配调试时,可以借助set指令来帮助我们。使用方法如下:

  1. location /proxy { # 设置$X_test的值为'match location'
  2. set $X_test 'match location'; # 在location规则中设置set指令
  3. proxy_pass http://192.168.20.3/merchant;
  4. }
  5. # 设置访问日志格式记录set的变量值:
  6. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  7. '$status $body_bytes_sent "$http_referer" '
  8. '"$http_user_agent" "$http_x_forwarded_for" location: "$X_test"';
  9. # 在日志格式中添加:location: "$X_test"',以便记录此变量的值

如果url匹配到此location规则,那么X_test的值就会是我们设置的值match location,如果没有则日志中记录的X_test就会为空值。

如下所示,分别为匹配和没有匹配时,日志所记录的内容:

nginx location匹配规则 - 图1

你get到了么?

参考:nginx location匹配规则 - 图2