0%

nginx学习笔记:location配置

写在前面

location 也是nginx配置当中的一个重点,基本语法如下:

1
2
3
4
location [=|~|~*|^~] /uri/ 
{

}

这则笔记整理location的语法,并结合实验进行说明。

理论篇:location语法

1
location [ = | ~ | ~* | ^~ ] uri { ... }

说明:location关键字,后面跟着可选的修饰符,后面是要匹配的字符,花括号中是要执行的操作。

修饰符及其优先级

符号 说明
= 表示精确匹配
^~ 表示uri以指定字符或字符串开头
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配
/ 通用匹配,任何请求都会匹配到

优先级说明:

= 高于 ^~ 高于 ~* 等于 ~ 高于 /

location匹配过程

  1. 检查使用前缀字符定义的location,选择最长匹配的项并记录下来。如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。

  2. 按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。

  3. 如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。

实践篇:location匹配示例

前提准备:

安装第三方模块echo-nginx-mudule

为了能够让试验结果显而易见,我们需要安装第三方模块echo-nginx-mudule,让我们在nginx中支持echo命令。

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
//安装git
yum install -y git

//进入源码包文件夹
cd /usr/local/src/

//下载echo-nginx-module
git clone https://github.com/openresty/echo-nginx-module.git

//进入nginx源码包
cd nginx-1.14.0

//重新预编译
./configure \
--prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--add-module=/usr/local/src/echo-nginx-module \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre

//编译安装
make && make install

//重启nginx
systemctl restart nginx

nginx默认配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server
{
listen 80 default_server;
server_name test.com *.test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com/;
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
}
}

浏览器访问

第一部分:测试各种修饰符的基本用法

测试用=进行精确匹配

1
2
3
4
5
6
7
8
9
10
11
server
{
listen 80 default_server;
server_name test.com *.test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com/;
location ='/abc.png'$
{
echo 'bingo!'
}
}

测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
//精确匹配
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/abc.html'
bingo!

//不匹配
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/lol/abc.html'
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

正则匹配:区分大小写

1
2
3
4
5
6
7
8
9
10
11
server
{
listen 80 default_server;
server_name test.com *.test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com/;
location ~ 'abc'
{
echo 'bingo!'
}
}

测试结果(只要包含指定字段都会被匹配)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//只要包含该字段都匹配
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/abc.html'
bingo!
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/abc1.html'
bingo!
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/abc/1.html'
bingo!

//大小写不一致则不匹配
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/Abc/1.html'
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

正则匹配:不区分大小写

1
2
3
4
5
6
7
8
9
10
11
server
{
listen 80 default_server;
server_name test.com *.test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com/;
location ~* 'abc'
{
echo 'bingo!'
}
}

测试结果

1
2
3
4
5
6
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/abc.html'
bingo!
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/Abc/1.html'
bingo!
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/Abc/1.html'
bingo!

正则匹配:以某个字段开头

1
2
3
4
5
6
7
8
9
10
11
server
{
listen 80 default_server;
server_name test.com *.test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com/;
location ~* 'abc'
{
echo 'bingo!'
}
}

测试结果

1
2
3
4
5
6
7
8
9
10
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/abc/1.html'
bingo!
[root@local-linux02 test.com]# curl -x 127.0.0.1:80 'test.com/123/abc.html'
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

第二部分:优先级测试

优先级排序如下:

= 高于 ^~ 高于 ~* 等于 ~ 高于 /

对比/和~

结论:~ 优先级高于 /

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//配置如下
server{
listen 80;
server_name test.com;
root /data/wwwroot/test.com;

location /abc/
{
echo "/";
}
location ~ 'abc'
{
echo "~";
}
}

//测试
[root@local-linux02 test.com]# curl -x127.0.0.1:80 'test.com/abc/1.png'
~

对比~和~*

结论:~和~*优先级其实是一样的,如果两个同时出现,配置文件中哪个location靠前,哪个生效。

示例1:
server
{
    listen 80;
    server_name test.com;
    root /data/wwwroot/test.com;

    location ~ 'abc'
    {
        echo '~';
    }
    location ~* 'abc'
    {
        echo '~*';
    }
}

//测试:
curl -x127.0.0.1:80 'test.com/abc/123.html' 
结果是:~

示例2:
server
{
    listen 80;
    server_name test.com;
    root /data/wwwroot/test.com;

    location ~* 'abc'
    {
        echo '~*';
    }
    location ~ 'abc'
    {
        echo '~';
    }
}

//测试:
curl -x127.0.0.1:80 'test.com/abc/123.html' 
结果是:~*

结论:~和~*优先级其实是一样的,如果两个同时出现,配置文件中哪个location靠前,哪个生效。

对比^~和~

结论:^~ 优先级高于 ~

server
{
    listen 80;
    server_name test.com;
    root /data/wwwroot/test.com;

    location ~ '/abc'
    {
        echo '~';
    }
    location ^~ '/abc'
    {
        echo '^~';
    }
}

测试:
curl -x127.0.0.1:80 'test.com/abc/123.html
结果是:^~

对比=和^~

结论:= 优先级高于 ^~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server
{
listen 80;
server_name test.com;
root /data/wwwroot/test.com;

location ^~ '/abc.html'
{
echo '^~';
}
location = '/abc.html'
{
echo '=';
}
}

测试:
curl -x127.0.0.1:80 'test.com/abc.html
结果是:=
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!