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错误码。