Nginx location匹配规则

以下列配置为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name jouypub.com;

location ^~ /. {
return 404;
}
location ^~ /api {
proxy_pass http://localhost:8000;
}
location / {
root /services/apps/front/;
}
}

location语法规则: location [=|~|~*|^~] /uri/ { … }

= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配
!~!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。

如果匹配规则以^开头,就是匹配以指定字符串开头的路径,如果没有就是匹配url中的内容是否包含指定字符串
如果匹配规则以$结尾,就是匹配以指定字符串结尾的路径

多个location配置的情况下匹配顺序为(当有匹配成功时候,停止匹配,按当前匹配规则处理请求):

  1. 优先匹配 =
  2. 其次匹配 ^~
  3. 按照文件中的匹配顺序执行
  4. 最后匹配 /

举例

1、必选规则

1
2
3
location / {
root /services/apps/front/;
}

2、匹配静态资源

1
2
3
4
5
6
location ^~ /static/ {
root /services/apps/front/static;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}

3、防盗链

1
2
3
4
5
6
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked jouypub.com files.jouypub.com;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}

jouypub.com、files.jouypub.com是运行出现的白名单

4、根据文件类型设置过期时间

1
2
3
4
5
6
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}

5、禁止访问某个目录

1
2
3
4
location ~* \.(txt|doc)${
root /services/apps/front/doc;
deny all;
}

location中的/结尾和非/结尾

1
2
3
location ^~ /api {
proxy_pass http://localhost:8000;
}
1
2
3
location ^~ /api {
proxy_pass http://localhost:8000/;
}

访问路径http://www.jouypub.com/api/a.html
规则1会被转发到:http://localhost:8000/api/a.html
规则2会被转发到:http://localhost:8000/a.html

JouyPub wechat
欢迎订阅「K叔区块链」 - 专注于区块链技术学习