Bootstrap

Nginx系列-5 root和alias和index和try_files

1.root和alias

root和alias用于指定文件系统的路径。root一般定义在server块中,为每个server指定文件系统路径;alias只能定义在location块中,为具体的url指定文件系统。二者的差别还体现在:
[1] root只能指定目录,而alias可以指定目录也可以指定文件;
[2] root和alias的路径拼接方式不同。
本章节在介绍root和alias的使用过程中,会围绕差异点进行细致描述。如果对这两点比较熟悉,请直接跳过本章内容。

1.1 root用法

说明: root指令可以基于相对路径或者绝对路径;当使用相对路径是,相对于即Nginx的安装路径(prefix);建议使用绝对路径

server {
    listen  8001;
    server_name  localhost;
    
    #等价于 root /home/sy/;
    root /home/sy;
    
    location /static {
    }
}

当访问http://localhost:8001/static/abc地址时,nginx会按照/home/sy/static/abc路径寻找文件或目录。
拼接方式
http://{域名}:{端口} 段替换为root指定的目录。
寻找文件和目录的策略:
首先说明一下location块的如果没有手动设置Index指令,会使用默认值: index index.html;, 即上述的location块实际为:

location /static {
	index index.html;
}

[1] 当请求url为http://localhost:8001/static时, Nginx认为static为文件:
case1: 判断/home/sy/static文件是否存在,存在-直接放回;
case2: 判断/home/sy/static/文件夹是否存在,存在-返回301重定向到http://localhost:8001/static/路径;
case3: static文件或者static文件夹否不存在时,返回404.

[2] 当请求url为http://localhost:8001/static/时, Nginx认为static为文件夹:
case1: 判断/home/sy/static/文件夹是否存在, 不存在-返回404;
case2: 判断/home/sy/static/文件夹下index.html文件是否存在,不存在-返回403;
case3: /home/sy/static//文件夹下index.html文件文件存在,则直接将index.html文件返回.

1.2 alias用法

server {
    listen  8001;
    server_name  localhost;
    
    location /static {
        #不同于 alias /home/sy;
    	alias /home/sy/;
    }
}

当访问http://localhost:8001/static/abc地址时,nginx会按照/home/sy/abc路径寻找文件或目录。
说明:alias /home/sy/指令,指定当前文件系统路径为/home/sy/目录,而alias /home/sy;中sy可以是文件也可以是文件夹;方便维护起见,一般以/结尾。

拼接方式
将请求url去除http://{域名}:{端口}部分后,再去除location匹配的url部分,将剩余部分追加到alias声明的路径下。因此,location匹配url部分和alias定义时,是否以/结尾对url拼接有重要影响。如下几个案例:

案例1: alias /home/sy/文件夹

location /static {
	alias /home/sy/;
}
#访问http://localhost:8001/static/abc 
#拼接得到:/home/sy/abc


location /static/ {
	alias /home/sy/;
}
#访问http://localhost:8001/static/abc
#拼接得到:/home/sy/abc

案例2:alias /home/sy/文件

location /static {
	alias /home/sy;
}
#访问http://localhost:8001/static/abc 
#拼接得到:/home/sy/abc


location /static/ {
	alias /home/sy;
}
#访问http://localhost:8001/static/abc
#拼接得到:/home/syabc

注意:如果使用alias指令时不以/结尾,此处会访问/home/syabc,可能引入隐患。

寻找文件和目录的策略:
如果客户端请求以/结尾,表明请求的是目录,否则表明请求的是文件。文件不存在、目录不存在、目录下的index.html文件不存在、重定向以及相关错误码与root完全一致;这里不再进行赘述。

2.index

在root和alias章节中使用到了index指令,本章节对index指令的使用方式进行介绍。

说明:index可以定义在server块或者location块中

index指令用于定义访问目录是的默认文件,如下所示:

server {
    listen  8001;
    server_name  localhost;
    root /home/seong/;
    location /static/ {
		index index.html index.htm;
    }
}

当客户端请求路径为/static/,从而访问/home/seong/目录时,nginx按照定义顺序依次搜索该目录下的index.html文件和index.htm文件;返回第一个存在的文件,否则返回404.
index指令还可用于定义默认首页:

server {
    listen  8001;
    server_name  localhost;
    root /home/seong/;
	index index.html;
}

此时http://localhost:8001或者http://localhost:8001/时,将返回/home/seong/index.html文件。

3.try_files

try_files指令主要定义location块中(也可定义在server块),用于控制文件查找和请求重定向的逻辑 。
存在两种语法格式:
[1] 格式1: try_files file1 file2 … uri;
uri可以是本地文件系统的路径,或者是在当前 server 或 location 上下文中定义的一个 URI,如下所示:

location / {  
    root /home/seong;  
    try_files $uri $uri/ /index.html;  
}  

当$uri和$uri/指代的文件都不存在时, Nginx 会尝试在内部重写请求到/index.html.
uri也可以是以@开头命名的location,如下所示:

location / {  
    root /home/seong; 
    try_files $uri $uri/ @redirect_to_baidu;  
}  
  
location @redirect_to_baidu {
    return 301 http://www.baidu.com;  
}

[2] 格式2: try_files file1 file2 … =code;

server {  
    listen 80;  
    server_name example.com;  
  
    location / {  
        root /var/www/html;  
        try_files $uri $uri/ =400;  
    }  
}

当$uri和$uri/指代的文件都不存在时,返回400错误码。

;