location 用法

语法规则

location [=|~|~*|^~] /uri/ { … }

规则 作用
= /uri 表示精确匹配,只有完全匹配上才能生效
^~ /uri 对URL路径进行前缀匹配,并且在正则之前
~ pattern 表示区分大小写的正则匹配
~* pattern 表示不区分大小写的正则匹配
/uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
/ 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

前缀匹配时,Nginx 不对 url 做编码,因此请求为 /static/20%/aa,可以被规则 ^~ /static/ /aa 匹配到(注意是空格)

匹配顺序

  • 首先精确匹配 =
  • 其次前缀匹配 ^~
  • 其次是按文件中顺序的正则匹配
  • 然后匹配不带任何修饰的前缀匹配
  • 最后是交给 / 通用匹配

当有匹配成功时候,停止匹配,按当前匹配规则处理请求

注意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配 location /dir01 与 location /dir01/dir02,如有请求 http://localhost/dir01/dir02/file 将最终匹配到 location /dir01/dir02

匹配举例

示例1:路径匹配

匹配规则如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
location = / {
echo "规则A";
}

location = /login {
echo "规则B";
}

location ^~ /static/ {
echo "规则C";
}

location ^~ /static/files {
echo "规则X";
}

location ~ \.(gif|jpg|png|js|css)$ {
echo "规则D";
}

location ~* \.png$ {
echo "规则E";
}

location /img {
echo "规则Y";
}

location / {
echo "规则F";
}
访问路径 示例路径 匹配规则 说明
/ localhost 规则A
/login localhost/login 规则B
/static/a.html localhost/static/a.html 规则C
/static/files/a.exe localhost/static/files/a.exe 规则X 虽然 规则C 也能匹配到,但因为最大匹配原则,最终选中了 规则X
/a.gif localhost/a.gif 规则D
/a.PNG localhost/a.PNG 规则E 规则E 不区分大小写
/b.png localhost/b.png 规则D 规则D 顺序优先,规则E 不起作用
/static/c.png localhost/static/c.png 规则C 优先匹配到 规则C
/img/a.gif localhost/img/a.gif 规则D 规则Y 也可以匹配上,但是因为正则匹配优先,而忽略了规则Y
/img/a.tiff localhost/img/a.tiff 规则Y
/register localhost/register 规则F
/category/id/1111 localhost/category/id/1111 规则F

示例2:常用匹配规则

nginx 作为 http 服务器的强项

方式一:目录匹配

1
2
3
location ^~ /static/ {
root /webroot/static/;
}

方式二:后缀匹配

1
2
3
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}


转发动态请求到后端应用服务器

1
2
3
location / {
proxy_pass http://tomcat:8080/
}

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。这里是直接转发给后端应用服务器了,也可以是一个静态首页

1
2
3
location = / {
proxy_pass http://tomcat:8080/index
}

403 Forbidden

检查步骤

  1. 关闭SELinux

    • 查看状态 sestatus –v
    • 临时关闭 setenforce 0 (需要root身份),修改为permissive模式
  1. 检查用户权限, 确认配置文件里面的user是否有权限访问路径

    • 修改目录权限
    • 修改目录所属用户
  1. 确认文件存在

uri末尾 / 作用

反向代理

测试路径:http://localhost/proxy/test.html

1
2
3
 location  /proxy/ {
proxy_pass http://127.0.0.1:8000/;
}

实际访问路径为 http://127.0.0.1:8000/test.html


如果去掉末尾 /

1
2
3
 location  /proxy {
proxy_pass http://127.0.0.1:8000/;
}

实际访问路径为 http://127.0.0.1:8000/proxy/test.html


代理地址不包含 /

1
2
3
 location  /proxy/ {
proxy_pass http://127.0.0.1:8000/api;
}

实际访问路径:http://127.0.0.1:8000/proxy/api/test.html


代理地址包含 /

1
2
3
 location  /proxy/ {
proxy_pass http://127.0.0.1:8000/api/;
}

实际访问路径:http://127.0.0.1:8000/proxy/api/test.html