nginx中root和alias的区别
CSDN话题挑战赛第2期
参赛话题:一起学Java
一、遇到问题现象
今天使用nginx搭建了一个网站,访问后出现404错误Not found. 上网查了一下原因,是由于nginx的配置不对。因为我是有两个web目录,这两个目录在不同的位置上。而且我不想把两个目录合并在一起,所以就要配置两个location。配置如下:
server {
listen 90 ssl;
server_name localhost;
ssl_certificate /n1.pem;
#从腾讯云获取到的第二个文件的全路径
ssl_certificate_key /n1.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#charset koi8-r;
#access_log logs/host.access.log main;
#测试根
location / {
root /web/test;
index index.html index.htm;
}
#测试使用pak包
location /pak/ {
root /usr/local/ ;
}
#正式使用dev包
location /dev/ {
root /web/dev/doc/;
index index.html index.htm;
}
}
上面的配置浏览https://localhost/dev/会显示404错误,因为root属性指定的值是要加入到最终路径的,所以访问的位置变成了/web/dev/doc/dev/。而我不想把访问的URI加入到路径中。所以就需要使用alias属性,其会抛弃URI,直接访问alias指定的位置, 所以最终路径变成/web/dev/doc。
#正式使用dev包
location /dev/ {
alias /web/dev/doc/;
index index.html index.htm;
}
直观理解如下形式:
location /dev/{
alias /web/dev/doc/; #这个查找文件的路径直接是/web/dev/doc/
}
location /dev/{
root /web/dev/doc/; #这个查找文件的路径应该是/web/dev/doc/dev
}
#测试使用pak包
location /pak/ {
root /usr/local/ ;
}
## 这里使用root配置 如果访问 192.168.2.3/pak/a.html 则对应的路径为:/usr/local/pak/a.html
通过root配置则location配置的/pak/一定是要在root对应的/usr/local/目录下要有的目录
二、alias与root的用法区别
最基本的区别:alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。另外,根据前文所述,使用alias标签的目录块中不能使用rewrite的break。
(1) . alias虚拟目录配置中,location匹配的path目录如果后面不带"/“,那么访问的url地址中这个path目录后面加不加”/“不影响访问,访问时它会自动加上”/“;
但是如果location匹配的path目录后面加上”/“,那么访问的url地址中这个path目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败!
(2) . root目录配置中,location匹配的path目录后面带不带”/",都不会影响访问。
所以,一般情况下,在nginx配置中的良好习惯是:
1)在location /中配置root目录;
2)在location /path中配置alias虚拟目录。