分布式 - 服务器Nginx:基础系列之Nginx静态资源配置指令server_name | listen | location | root | alias | index| error_page


通过浏览器发送一个HTTP请求实现从客户端发送请求到服务器端获取所需要内容后并把内容回显展示在页面。这个时候,我们所请求的内容就分为两种类型,一类是静态资源、一类是动态资源。静态资源即指在服务器端真实存在并且能直接拿来展示的一些文件,比如常见的html页面、css文件、js文件、图 片、视频等资源;动态资源即指在服务器端真实存在但是要想获取需要经过一定的业务逻辑处理,根据不同的条件展示在页面不同这 一部分内容,比如说报表数据展示、根据当前登录用户展示相关具体数据等资源;

Nginx处理静态资源的内容,我们需要考虑下面这几个问题:

(1)静态资源的配置指令
(2)静态资源的配置优化
(3)静态资源的压缩配置指令
(4)静态资源的缓存处理
(5)静态资源的访问控制,包括跨域问题和防盗链问题

先看下静态资源的配置指令。

01. server_name 指令

当收到一个请求时,nginx 会先检查请求的主机名和端口号是否与配置文件中的任何 server 块的监听地地址 (listen) 匹配。如果找到了匹配的监听地址,nginx 会继续检查 server 块中的 server_name 指令。server_name指令用于指定server 块所匹配的虚拟主机或IP。nginx 会按照以下顺序进行匹配:

  • 如果 server_name 指令中指定了具体的主机名,则请求的主机名必须与之完全匹配。
  • 如果 server_name 指令中使用了通配符,则请求的主机名必须与通配符匹配。
  • 如果 server_name 指令中使用了正则表达式,则请求的主机名必须与正则表达式匹配。

如果找到了与请求的主机名匹配的 server 块,nginx 会将请求转发给该 server 块中配置的相应的 location。如果没有找到与请求的主机名匹配的 server 块,nginx 会使用默认的 server 块来处理请求,如果没有设置默认的 server 块,则nginx 会使用第一个 server 块来处理该请求。

关于server_name 的配置方式有三种,分别是:精确匹配、通配符匹配、正则表达式匹配。

1. 精确匹配

精确匹配的语法:

server_name domain1.com domain2.com;
server_name 192.168.1.100;

其中,domain1.com 和 domain2.com是虚拟主机的域名,可以指定多个域名,用空格隔开。如果请求的主机名与server_name指定的任何一个域名匹配,Nginx就会将请求交给这个虚拟主机处理。除了域名,server_name还可以指定IP地址,这样,当请求的主机名为192.168.1.100时,Nginx就会将请求交给这个虚拟主机处理。

hosts是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。因为域名是要收取一定的费用,所以我们可以使用修改hosts文件来制作一些虚拟域名来使用。

# 配置hosts文件
[root@192 conf]# cat /etc/hosts
127.0.0.1 www.domain1.com
127.0.0.1 www.domain2.com

# 配置nginx.conf文件
[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen       8080;
        server_name  127.0.0.1;

        default_type text/plain;
        return 500 'This is a 500 request';
    }

    server {
        listen       8080;
        server_name  www.domain1.com www.domain2.com;

        default_type text/plain;
        return 444 'This is a 444 request';
    }
}

# 测试访问
[root@192 conf]# curl http://www.domain1.com:8080/
This is a 444 request

[root@192 conf]# curl http://www.domain2.com:8080/
This is a 444 request

[root@192 conf]# curl http://127.0.0.1:8080/
This is a 500 request

2. 通配符匹配

server_name中支持通配符*,但需要注意的是通配符不能出现在域名的中间,只能出现在首段或尾段。

# 配置nginx.conf文件
[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server {
    
    
        listen       8080;
        server_name  127.0.0.1;

        default_type text/plain;
        return 500 'This is a 500 request';
    }

    server {
    
    
        listen       8080;
        server_name  *.com;

        default_type text/plain;
        return 444 'This is a 444 request';
    }
}

# 测试访问
[root@192 conf]# curl  http://www.domain1.com:8080/
This is a 444 request

3. 正则表达式匹配

server_name中可以使用正则表达式,并且使用~作为正则表达式字符串的开始标记。常见的正则表达式:

代码 说明
^ 匹配搜索字符串开始位置
$ 匹配搜索字符串结束位置
. 匹配除换行符\n之外的任何单个字符
\ 转义字符,将下一个字符标记为特殊字符
[xyz] 字符集,与任意一个指定字符匹配
[a-z] 字符范围,匹配指定范围内的任何字符
\w 与以下任意字符匹配 A-Z a-z 0-9 和下划线,等效于[A-Za-z0-9_]
\d 数字字符匹配,等效于[0-9]
{n} 正好匹配n次
{n,} 至少匹配n次
{n,m} 匹配至少n次至多m次
* 零次或多次,等效于{0,}
+ 一次或多次,等效于{1,}
? 零次或一次,等效于{0,1}
[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server {
    
    
        listen       8080;
        # 以^开头,以$结尾
        server_name  ~^www\.(\w+)\.com$;

        default_type text/plain;
        # $1 匹配的是 (\w+) 中的值
        return 444 '=====》$1 =====》';
    }
}

# 测试
[root@192 conf]# curl  http://www.domain2.com:8080/
=====》domain2 =====[root@192 conf]# curl  http://www.domain1.com:8080/
=====》domain1 =====

4. default_server 属性

在 Nginx 中,default_server 属性是用来标识一个虚拟主机的,它的作用是将此虚拟主机设置成默认主机。所谓的默认主机是指当 Nginx 收到一个请求时,如果没有匹配到对应的 server 块,则会默认使用 default_server 所对应的虚拟主机来处理该请求。如果没有设置 default_server,则 Nginx 会使用第一个 server 块来处理该请求。

① 如果没有匹配到对应的 server 块,则会默认使用 default_server 所对应的虚拟主机来处理该请求。

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server {
    
    
        listen       8080;
        server_name  www.hh.com;

        default_type text/plain;
        return 444 'This is a 444 request';
    }
    
   server {
    
    
        listen       8080 default_server;
        server_name  www.hh.com ;

        default_type text/plain;
        return 500 'This is a 500 request';
    }
}

# 如果没有匹配到对应的 server,则会默认使用 default_server 所对应的虚拟主机来处理该请求 
[root@192 conf]# curl  http://127.0.0.1:8080/
This is a 500 request

[root@192 conf]# curl http://192.168.38.34:8080/
curl: (7) Failed connect to 192.168.38.34:8080; 没有到主机的路由

② 如果没有设置 default_server,则 Nginx 会使用第一个 server 来处理该请求。

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server {
    
    
        listen       8080;
        server_name  www.hh.com;

        default_type text/plain;
        return 444 'This is a 444 request';
    }
    
   server {
    
    
        listen       8080;
        server_name  www.hh.com;

        default_type text/plain;
        return 500 'This is a 500 request';
    }
}

# 如果没有设置 default_server,则 Nginx 会使用第一个 server 来处理该请求 
[root@192 conf]# curl  http://127.0.0.1:8080/
This is a 444 request

5. 匹配顺序案例

由于 server_name 指令支持通配符和正则表达式,因此在包含多个server块的配置文件中,可能会出现一个名称被多个虚拟主机的 server_name 匹配成功的情况,这时当前的请求交给谁来处理呢?

① 存在server_name为精确匹配、正则表达式匹配、通配符在开始匹配、通配符在结尾匹配、默认配置的server块:

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name www.domain1.com;
        default_type text/plain;
        return 200 '精确匹配成功';
    }

    server{
    
    
        listen 8080;
        server_name ~^www\.\w+\.com$;
        default_type text/plain;
        return 200 '正则表达式匹配成功';
    }

    server{
    
    
        listen 8080;
        server_name www.domain1.*;
        default_type text/plain;
        return 200 '通配符匹配*成功';
    }

    server{
    
    
        listen 8080;
        server_name *.domain1.com;
        default_type text/plain;
        return 200 '*通配符匹配成功';
    }

    server{
    
    
        listen 8080 default_server;
        server_name _;
        default_type text/plain;
	    return 444 'default_server未找到server匹配成功';
    }
}

[root@192 conf]# curl  http://www.domain1.com:8080/
精确匹配成功

② 存在server_name为正则表达式匹配、通配符在开始匹配、通配符在结尾匹配、默认配置的server块:

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name ~^www\.\w+\.com$;
        default_type text/plain;
        return 200 '正则表达式匹配成功';
    }

    server{
    
    
        listen 8080;
        server_name www.domain1.*;
        default_type text/plain;
        return 200 '通配符匹配*成功';
    }

    server{
    
    
        listen 8080;
        server_name *.domain1.com;
        default_type text/plain;
        return 200 '*通配符匹配成功';
    }

    server{
    
    
        listen 8080 default_server;
        server_name _;
        default_type text/plain;
	    return 444 'default_server未找到server匹配成功';
    }
}

[root@192 conf]# curl  http://www.domain1.com:8080/
*通配符匹配成功

③ 存在server_name为正则表达式匹配、通配符在结尾匹配、默认配置的server块:

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name ~^www\.\w+\.com$;
        default_type text/plain;
        return 200 '正则表达式匹配成功';
    }

    server{
    
    
        listen 8080;
        server_name www.domain1.*;
        default_type text/plain;
        return 200 '通配符匹配*成功';
    }

    server{
    
    
        listen 8080 default_server;
        server_name _;
        default_type text/plain;
	    return 444 'default_server未找到server匹配成功';
    }
}

[root@192 conf]# curl  http://www.domain1.com:8080/
通配符匹配*成功

④ 存在server_name为正则表达式匹配、默认配置的server块:

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name ~^www\.\w+\.com$;
        default_type text/plain;
        return 200 '正则表达式匹配成功';
    }

    server{
    
    
        listen 8080 default_server;
        server_name _;
        default_type text/plain;
	    return 444 'default_server未找到server匹配成功';
    }
}

[root@192 conf]# curl  http://www.domain1.com:8080/
正则表达式匹配成功

⑤ 匹配默认配置的server块:

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080 default_server;
        server_name _;
        default_type text/plain;
	    return 444 'default_server未找到server匹配成功';
    }
}

[root@192 conf]# curl  http://www.domain1.com:8080/
default_server未找到server匹配成功

02. listen 指令

官方文档地址:https://nginx.org/en/docs/http/ngx_http_core_module.html#listen

在 Nginx 中,listen 指令用于指定 Nginx 监听的 IP 地址和端口号。它的语法如下:

listen address:port [options];

其中,address 表示要监听的 IP 地址,可以是一个具体的 IP 地址,也可以是一个通配符,如 * 表示监听所有可用的 IP 地址。port 表示要监听的端口号。options 是可选的,用于指定一些额外的选项,如 SSL/TLS 配置、HTTP/2 配置等。

以下是一些常见的 listen 指令的示例:

# 监听指定的IP和端口
listen 127.0.0.1:8000;  

# 监听指定IP的所有端口
listen 127.0.0.1;	

# 监听所有可用的 IP 地址,端口号为 8000
listen 8000;	

# 监听所有可用的 IP 地址,端口号为 80
listen *:80;

# 监听指定的 IP 地址,端口号为 8080,启用 SSL/TLS
listen 192.168.1.100:8080 ssl;

# 监听指定的 IP 地址,端口号为 443,启用 SSL/TLS 和 HTTP/2
listen 192.168.1.100:443 ssl http2;

① 修改nginx配置文件:监听虚拟主机的8080端口

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen       8080;
        server_name  127.0.0.1;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

② 测试访问:http://192.168.38.33:8080/

在这里插入图片描述

03. location 指令

location指令用于匹配请求的URI,并指定如何处理匹配到的请求。 location指令的语法如下:

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

其中,uri可以是一个字符串或一个正则表达式,用于匹配请求的URI。=表示精确匹配,表示区分大小写的正则匹配,*表示不区分大小写的正则匹配,^~表示普通字符串匹配。当一个请求到达 Nginx 时,它会按照一定的顺序逐个匹配 location 指令,直到找到第一个匹配的指令为止。下面是 location 指令的匹配顺序:

① 精确匹配 (=):如果请求的 URL 路径与指定的字符串完全匹配,则使用该配置块处理请求。例如:

location = /path {
    ...
}

② 前缀匹配 (^~):如果请求的 URL 路径以指定的字符串开头,则使用该配置块处理请求,并停止继续匹配其他 location 块。例如:

location ^~ /path {
    ...
}

③ 正则表达式匹配 (~~*):如果请求的 URL 路径与指定的正则表达式匹配,则使用该配置块处理请求。~表示区分大小写,~* 表示不区分大小写。例如:

location ~ /path {
    ...
}

④ 普通字符串匹配:如果请求的 URL 路径包含指定的字符串,则使用该配置块处理请求。例如:

location /path {
    ...
}

1. 精确匹配 (=)

如果请求的 URL 路径与指定的字符串完全匹配,则使用该配置块处理请求。

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name localhost;
        
        location = /path {
    
    
            default_type text/plain;
       	    return 200 'access success';
        }
    }
}

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path
access success

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path?a=zhangsan
access success

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/pathabc
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path/abc
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

2. 前缀匹配 (^~)

如果请求的 URL 路径以指定的字符串开头,则使用该配置块处理请求,并停止继续匹配其他 location 块。

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name localhost;
        
        location ^~ /path {
    
    
            default_type text/plain;
       	    return 200 'access success';
        }
    }
}

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path
access success

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/pathabc
access success

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path/abc
access success

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/pat
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

3. 正则表达式匹配 (~ 或 ~*)

如果请求的 URL 路径与指定的正则表达式匹配,则使用该配置块处理请求。~表示区分大小写,~* 表示不区分大小写。

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name localhost;
        
        # 正则表达式匹配,~^ 表示后面的路径是以 "/path" 开头,\w 表示匹配一个字母或数字,$ 表示路径的结尾。
        location ~^/path\w$ {
    
    
            default_type text/plain;
       	    return 200 'access success';
        }
    }
}

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path2
access success

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/patha
access success

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/Patha
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/pathab
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path/abc
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>
[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name localhost;
        
        # 正则表达式匹配,~*^ 表示后面的路径是以 "/path" 开头,\w 表示匹配一个字母或数字,$ 表示路径的结尾。
        location ~*^/path\w$ {
    
    
            default_type text/plain;
       	    return 200 'access success';
        }
    }
}

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/patha
access success

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path1
access success

# 可以匹配
[root@192 conf]# curl  http://192.168.38.33:8080/Patha
access success

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/Path/abc
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

# 无法匹配
[root@192 conf]# curl  http://192.168.38.33:8080/path
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

4. 普通字符串匹配

如果请求的 URL 路径包含指定的字符串,则使用该配置块处理请求。

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server{
        listen 8080;
        server_name localhost;
        
        location /path {
            default_type text/plain;
       	    return 200 'access success';
        }
    }
}

[root@192 conf]# curl  http://192.168.38.33:8080/path
access success

[root@192 conf]# curl  http://192.168.38.33:8080/path/
access success

[root@192 conf]# curl  http://192.168.38.33:8080/path/abc
access success

[root@192 conf]# curl  http://192.168.38.33:8080/path/abc/
access success

5. 匹配顺序案例

① 存在精确匹配、前缀匹配、正则表达式匹配、普通字符串匹配

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location = /path {
    
    
            default_type text/plain;
       	    return 200 '精确匹配';
        }
    }

    server{
    
    
        listen 8080;
        server_name localhost;
        
        location ^~ /path {
    
    
            default_type text/plain;
       	    return 200 '前缀匹配';
        }
    }
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location ~ /path {
    
    
            default_type text/plain;
       	    return 200 '正则表达式匹配';
        }
    }
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /path {
    
    
            default_type text/plain;
       	    return 200 '普通字符串匹配';
        }
    }
}

[root@192 conf]# curl  http://192.168.38.33:8080/path
精确匹配

② 存在前缀匹配、正则表达式匹配、普通字符串匹配

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    server{
    
    
        listen 8080;
        server_name localhost;
        
        location ^~ /path {
    
    
            default_type text/plain;
       	    return 200 '前缀匹配';
        }
    }
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location ~ /path {
    
    
            default_type text/plain;
       	    return 200 '正则表达式匹配';
        }
    }
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /path {
    
    
            default_type text/plain;
       	    return 200 '普通字符串匹配';
        }
    }
}

[root@192 conf]# curl  http://192.168.38.33:8080/path
前缀匹配

③ 存在正则表达式匹配、普通字符串匹配

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location ~ /path {
    
    
            default_type text/plain;
       	    return 200 '正则表达式匹配';
        }
    }
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /path {
    
    
            default_type text/plain;
       	    return 200 '普通字符串匹配';
        }
    }
}

[root@192 conf]# curl  http://192.168.38.33:8080/path
正则表达式匹配

04. root 指令

root 指令是用于指定 Nginx 服务器的根目录的指令。在 Nginx 配置文件中,可以使用 root 指令来指定服务器的根目录,它的语法如下:

root path;

其中,path 是服务器根目录的路径。可以使用绝对路径或相对路径。如果使用相对路径,则相对于 Nginx 配置文件的路径。

/usr/local/nginx/html目录下创建一个 image目录,并在目录下放入2张a.jpg、b.jpg图片:

① 使用相对路径:

[root@192 conf]# ls /usr/local/nginx/html/image
a.jpg  b.jpg

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /image {
    
    
            root   html;
        }
    }
}

当客户端请求 http://192.168.38.33:8080/image/b.jpg,这将会访问 /usr/local/nginx/html/image/b.jpg

② 使用绝对路径:root的处理结果是: root路径+location路径,/usr/local/nginx/html/image/b.jpg

[root@192 conf]# ls /usr/local/nginx/html/image
a.jpg  b.jpg

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /image {
    
    
            root   /usr/local/nginx/html;
        }
    }
}

当客户端请求 http://192.168.38.33:8080/image/b.jpg,这将会访问 /usr/local/nginx/html/image/b.jpg ,即 root 指定的路径 + location 指定的路径。

05. alias 指令

alias 指令用于将 URL 路径映射到服务器文件系统中的另一个位置。它的语法如下:

location /path {
    alias /new/path;
}

其中,/path 是客户端请求的 URL 路径,/new/path 是服务器文件系统中的实际路径。当客户端请求 /path 时,Nginx 会将其映射到 /new/path,并返回对应的文件或目录。

① 在/usr/local/nginx/html目录下创建一个 image目录,并在目录下放入2张a.jpg、b.jpg图片:

[root@192 conf]# ls /usr/local/nginx/html/image
a.jpg  b.jpg

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /image {
    
    
            alias /usr/local/nginx/html;
        }
    }
}

当客户端请求 http://192.168.38.33:8080/image/b.jpg,报错 404 Not Found。

查看nginx的错误日志:

[root@192 conf]# tail -f /usr/local/nginx/logs/error.log
2023/09/03 16:07:02 [error] 91629#0: *87 open() "/usr/local/nginx/html/b.jpg" failed (2: No such file or directory), client: 192.168.38.1, server: localhost, request: "GET /image/b.jpg HTTP/1.1", host: "192.168.38.33:8080"

可以看到访问的是 /usr/local/nginx/html/b.jpg,即 alias 指定的路径,使用 alias 指定的路径替代了 location 指定的路径。

② 重新修改配置文件中alias指定的路径:

[root@192 conf]# ls /usr/local/nginx/html/image
a.jpg  b.jpg

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /image {
    
    
            alias /usr/local/nginx/html/image;
        }
    }
}

当客户端请求 http://192.168.38.33:8080/image/b.jpg,访问的是 /usr/local/nginx/html/image/b.jpg

06. index 指令

index指令用于设置网站的欢迎页面。其语法如下:

index file1 [file2 ...];

其中,file1、file2等为索引文件名,可以指定多个,以空格分隔。nginx会按照指定的顺序依次查找这些文件,直到找到为止。如果都找不到,则返回403 Forbidden错误。

[root@192 conf]# ls /usr/local/nginx/html/image
a.jpg  b.jpg

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        location /image {
    
    
            root /usr/local/nginx/html;
            index b.jpg a.jpg;
        }
    }
}

当客户端请求 http://192.168.38.33:8080/image/ ,因为使用 index 指令指定了默认文件 b.jpg,Nginx 会放回 /usr/local/nginx/html/image/b.jpg 文件。如果该文件不存在,则会返回目录列表或者 403 Forbidden 错误。

07. error_page 指令

error_page 指令用于定义服务器在处理请求时遇到错误时的行为。该指令可以将错误页面重定向到指定的 URL 或本地文件,或者返回指定的 HTTP 状态码。以下是 error_page 指令的语法:

error_page code ... [=[response]] uri;

其中,code 是 HTTP 状态码,可以是单个状态码,也可以是多个状态码,用空格分隔。file 或 uri 是要显示的错误页面的文件路径或 URL。

# 将 404 错误页面重定向到 /404.html 页面
error_page 404 /404.html;

# 把所有 404、500、502、503 和 504 错误页面重定向到 /error.html 页面。
error_page 404 500 502 503 504 /error.html;

# 把所有 404 错误页面重定向到一个 403 状态码。
error_page 404 =403;

① 可以指定具体的跳转地址:

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server{
    
    
        listen 8080;
        server_name localhost;
        
        error_page 404 http://www.baidu.com;
    }
}

当客户端请求 http://192.168.38.33:8080/a 时,跳转到 http://www.baidu.com

② 可以指定重定向地址:

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server {
    
    
        listen 8080;
        server_name localhost;
        
        # 将 404 状态码到 /50x.html 页面
        error_page 404 /50x.html;
        
        # 把所有 500 502 503 504 状态码重定向到 /50x.html 页面。
        error_page 500 502 503 504 /50x.html;
        
        error_page 404 =200 /50x.html;
        location =/50x.html{
    
    
            root html;
        }
    }
}

客户端访问 http://192.168.38.33:8080/a

在这里插入图片描述

③ 可选项=[response]的作用是更改状态码

[root@192 conf]# cat nginx.conf
worker_processes  1;
events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    
    server {
    
    
        listen 8080;
        server_name localhost;

        # 当返回404找不到对应的资源的时候,在浏览器上可以看到,最终返回的状态码是200
        # 这块需要注意下,编写error_page后面的内容,404后面需要加空格,200前面不能加空格
        error_page 404 =200 /50x.html;
        location =/50x.html{
    
    
            root html;
        }
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42764468/article/details/132652998