一. root与alias的区别
Nginx中可以通过root和alias两个属性指定web资源文件的路径,但二者的配置范围和解释方式是有区别的。
配置范围的差异很明确,即alias属性只能用于location配置段,而root属性还可以用于server、http等配置段。
但root属性和alias属性的解释方式的差异则有些隐蔽,理解有误容易掉坑,造成404错误等。
[root]
语法:root path
默认值:root html
配置段:http、server、location、if
[alias]
语法:alias path
配置段:location
示例:
server {
listen 80;
server_name www.dancen.com;
root /home/site;
location /.well-known {
root /home/dancen;
}
location /src {
alias /mnt/volume/site/;
location ~* \.(htm|html)$ {
expires 300s;
}
location ~* \.(jpg|jpeg|png|gif|svg|webp|bmp|ico)$ {
expires 360d;
}
}
location /service {
proxy_redirect off;
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}
示例解释:
示例中,location属性将域名下不同的url引导到了不同的位置。
- http://www.dancen.com/test 没有匹配任何已定义的location,
此时Nginx将被引导至server>root属性定义的/home/site目录寻找文件,例如对于链接:
http://www.dancen.com/test/file.jpg
其对应的文件为:
/home/site/test/file.jpg - http://www.dancen.com/.well-known 匹配:
location /.well-known { root /home/dancen;}
此时Nginx将被引导至location>root属性定义的/home/dancen目录寻找文件,例如对于链接:
http://www.dancen.com/.well-known/file.jpg
其对应的文件为:
/home/dancen/.well-known/file.jpg - http://www.dancen.com/src 匹配:
location /src { alias /mnt/volume/site/;}
此时Nginx将被引导至location>alias属性定义的/mnt/volume/site目录寻找文件,例如对于链接:
http://www.dancen.com/src/file.jpg
其对应的文件为:
/mnt/volume/site/file.jpg
此处可以看到root属性和alias属性的作用非常相似,都是重新定义文件路径,例如location属性中root/alias属性定义的文件路径将会覆盖server属性中定义的文件路径。
那么,二者的差别在哪里呢?假设这里将alias改为root,那么,Nginx将被引导至location>root属性定义的/mnt/volume/site目录寻找文件,同样的链接:
http://www.dancen.com/src/file.jpg 其对应的文件为:
/mnt/volume/site/src/file.jpg
仔细对比可以看到,二者对应的文件不同了:
root属性:文件路径=root路径+location路径+url相对路径
alias属性:文件路径=alias路径+url相对路径
从字面上理解,root属性指定的文件路径是根目录,负责将链接引导至根目录,然后寻找由location属性值和url相对路径结合起来指定的文件。alias属性指定的是location属性值的别名,alias属性值会替代location属性值,负责将链接引导至别名目录,然后寻找由url相对路径指定的文件。
- http://www.dancen.com/service 匹配location /service
此时Nginx将链接转发至本机的8080端口,即Nginx作为代理服务器使用。
二. location的嵌套使用
正如上面的例子,location属性也可以定义在location属性中,从而实现location属性的嵌套使用。例如,第一层location用于请求链接的分类,第二层location则用于给不同类型的资源文件定义不同的过期时间,在某些使用场景下,这是非常有用的。
示例:
location /src {
alias /mnt/volume/site/;
location ~* \.(htm|html)$ {
expires 300s;
}
location ~* \.(jpg|jpeg|png|gif|svg|webp|bmp|ico)$ {
expires 360d;
}
}