
## 例如下 -----------------------------------------------------
# 静态资源(永远不走正则)
location ^~ /assets/ {
root /var/www/app;
expires 1y;
access_log off;
}
# 图片、字体等
location ~* \.(png|jpg|woff2|css|js)$ {
root /var/www/app;
expires 30d;
}
# SPA 入口
location /web {
root /var/www/app;
try_files $uri $uri/ /index.html;
}
一般推荐使用root,aliase仅用于URL与磁盘目录不对应时;
## root示例说明 ----------------------------------------------------------------
location /static/ {
root /var/www;
}
## 访问:/static/logo.png
## 真实路径为:/var/www/static/logo.png
## 真实路径 = root + 完整请求URI
## alias示例说明 ---------------------------------------------------------------
location /static/ {
alias /var/www/assets/;
}
## 访问:/static/logo.png
## 真实路径为:/var/www/assets/logo.png
## 真实路径 = alias + (URI 去掉 location 前缀)
## 注:location 结尾的 / 非常重要
综上,root 是拼接路径,alias 是替换路径;
注意:
1>. 除非迫不得已,否则不要使用alias,因为 alias 在 try_files 不会自动替换路径;
2>. 一个配置中可以同时存在多个使用 root 的location配置;
try_files 的作用是 按顺序检查文件是否存在,并使用找到的第一个文件来处理请求;如果指定的所有文件都找不到,它会执行最后一个。
## 按顺序先找$uri,存在则返回,不存在则再找$uri/
## $uri/存在则返回,不存在则再找index.html;
## index.html存在则返回,不存在则返回500错误
try_files $uri $uri/ /index.html;
## 按顺序先找$uri,存在则返回,不存在则再找$uri/index.html;
## $uri/index.html存在则返回,不存在则返回404
try_files $uri $uri/index.html =404;
## 查找匹配顺序同上
## last 表示强制重新走一次 location 匹配流程(不推荐使用,容易陷入死循环)
try_files $uri $uri/ /index.html last;
注意:
1>. try_files 的最后一个参数或文件是内部重定向;如上,Nginx不会检查最后一个 /index.html 是否存在,而是直接发起一个新的“内部请求”去访问 /index.html;Nginx 带着 /index.html 这个新路径重新匹配 location 块,如果它再次匹配到了同一个 location / 块,又发现文件不存在,就会继续循环发起请求,最终内部重定向超过10次,就会停止尝试并返回500错误;
2>. $uri/index.html 和 /index.html 有巨在差异;$uri/index.html 是访问指定 $uri 目录下的 index.html 文件;/index.html是直接访问项目根目录下的 index.html;
3>. 使用 alias 时,try_files 中的 $uri 仍然代表的是请求中原始的URI,nginx不会在这里自动去替换;因此,请尽量不要使用 alias;
4>. 除非迫不得已,否则不要使用alias,一个配置中可以同时存在多个使用 root 的location配置;