背景: Nginx 中想在 一个location 中通过root 指令单独定义一个linux 系统下的目录当作此location 读取资源的目录。
以下测试场景发起请求的url : http://192.168.8.198:19999
遇到的坑: 当我在location 中用精确匹配(=) 进行匹配在同一个location 中使用root 指令指定资源目录时, 此时nginx会读取 它的默认资源目录(nginx/html),无法达请求到我所指定目录下资源。
#代码示例
server{
listen 19999 ;
server_name www.test.com;
#root /html/www/;
error_log /nginx/logs/test.log;
access_log /nginx/logs/test.log;
location = / {
root /html/www/;
index index.html;
}
}
经过测试验证,总结以下规律:
经过测试发现 alias 指令和root指令此场景使用效果相同
-
在location 中使用精确匹配时,通过root 指令 在http、或server 中指定资源目录(/html/www/)就可以被读取到。
#代码示例 server{ listen 19999 ; server_name www.test.com; root /html/www/; error_log /nginx/logs/test.log; access_log /nginx/logs/test.log; location = / { index index.html; } }
-
在location 中 使用^~、 ~ 、 ~*、/等匹配方式,,通过root 指令指定资源目录(/html/www/) 也可以被正常读取到。
#代码示例 server{ listen 19999 ; server_name www.test.com; error_log /nginx/logs/test.log; access_log /nginx/logs/test.log; location ~ / { root /html/www/; index index.html; } }
验证上一个场景的过程中,总结 root指令 和 alias 指令 使用的一些区别
若用alias的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件,比如:
发起请求 http://192.168.8.198:19999/local
则是对应到服务器下的/html/www/index.html
, 说明 在使用alias 指令时,location 处的 匹配只做请求的匹配验证,请求带的uri 不会更改alias 指定的资源目录。
location /local {
alias /html/www/;
index index.html;
}
若用root的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件 ,比如:
发起请求http://192.168.8.198:19999/www
则是对应服务器下的/html/www/index.html
,说明 请求带的uri 中的路径会自动拼接到root指定的资源目录后边。
location /www {
root /html/;
index index.html;
}