这里记录一下这个知识点,之前也没有特意对这个这个知识点做过汇总
问ChatGPT:
你详细解释下try_files 指令?
ChatGPT回答:
当Nginx处理客户端请求时,try_files
指令用于按照指定的顺序尝试查找文件,并在找到匹配的文件时返回内容,或者在没有找到匹配文件时执行备用操作。通常,try_files
指令用于静态文件服务器的配置,以确定如何响应用户请求。
try_files
指令的语法如下:
Copy code
try_files file ... uri;
file ...
:这是一个或多个文件路径,用空格分隔。Nginx会按照指定的顺序尝试查找这些文件。如果找到了任何一个文件,Nginx将返回该文件的内容。
uri
:这是备用操作,当找不到匹配的文件时执行。通常,这是一个URL路径,可以是相对路径(相对于服务器的根目录)或绝对路径。
try_files
指令的执行流程如下:
Nginx会按照指定的顺序尝试查找 file
路径中列出的文件。如果找到匹配的文件,它会返回该文件的内容。
如果在 file
路径中的文件都没有找到,则 Nginx 会执行备用操作,即根据 uri
进行处理。
一般情况下,try_files
的常见用法是:
nginxCopy code
try_files $uri $uri/ /fallback-path;
在这个例子中:
$uri
:Nginx会尝试查找与请求路径相对应的文件。$uri/
:Nginx会尝试查找与请求路径加上斜杠对应的目录(通常用于查找目录下的默认文件)。/fallback-path
:如果前面的查找都没有匹配成功,Nginx会执行备用操作,使用这个路径来处理。file...
这里是说 try_files 中间的参数都是file,不是路径,这个指令的目的是找到文件
location /abc {
root /data/www/team/;
try_files 1.html 2.html @qwe;
}和
location /abc {
alias /data/www/team/;
try_files 1.html 2.html @qwe;
}区别
root
和 alias
在 Nginx 配置中的用法非常相似,但它们在处理请求时有一些区别。下面是两个配置之间的主要区别:
root
:location /abc {
root /data/www/team/;
try_files 1.html 2.html /forward_uri;
}
root
指令时,Nginx会将请求的 URI 路径直接映射到文件系统路径,然后根据文件系统路径查找文件。所以,请求 /abc/1.html
会在 /data/www/team/abc/1.html
路径下查找文件。root
通常能够直接工作location /abc {
alias /data/www/team/;
try_files 1.html 2.html /forward_uri;
}
alias
指令时,Nginx将根据 alias
指令提供的路径映射请求的 URI 路径。所以,请求 /abc/1.html
会在 /data/www/team/1.html
路径下查找文件。alias
可以更精确地控制 URI 路径与文件系统路径之间的映射,而不受 URI 路径中的目录结构的影响。总之,两者的区别在于文件系统路径的构建方式。root
会将请求的 URI 路径直接添加到根路径下,而 alias
则会替换 URI 路径的部分,并根据 alias
指令提供的路径构建文件系统路径。根据你的需求,你可以选择适合的指令来处理文件系统路径的映射。
$uri是一种变量,以为着所有上述1.html这类的文件以及1.html/index.html的文件,1.html/ 有点奇怪,换一种 geoip 和 geoip/index.html ,有没有这种没有后缀名的文件?答案是肯定的
这种文件是存在的,当然它也可以是一个文件夹 geoip/index.html ,所以这些类型$uri 和 $uri/都能包含,甚至包括它们的子目录都是这样找文件,要么找到文件返回去,要么找到该目录下的index.html返回去
这个估计绕了很多人,因为上面有个alias path,我们自然以为还是在这个路径下,其实是相对域名的,因此如果你的vue-router 你想放在某个路径下,例如/admin 前缀下,那么再上面file...都找不到的时候,跳转的是
https://xxx.example.com/admin/index.html,如果你写成了/index.html,则跳转的是
https://xxx.example.com/index.html 这个自然是找不到的路径,因此报404
所以你要配置为
A项目
http://xxx.example.com/A
B项目
http://xxx.example.com/B
nginx的配置
location ^~/A {
alias /XX/A;//此处为A的路径
index index.html;
try_files $uri $uri/ /A/index.html;
}
location ^~/B {
alias /XX/B;//此处为B的路径
index index.html;
try_files $uri $uri/ /B/index.html;
}
这样vue-router,history二级路由/admin/dashbord才能被正确找到/admin/index.html 这个文件被加载到浏览器后,js运行起来后,才能识别/admin/dashbord这个概念,当然vue端要配置publicPath:"/admin",否则分片载入的js路径还是/2ea8e923cad.js 是找不到的,因为前端请求是
https://xxx.example.com/2ea8e923cad.j,加上publicPath之后,就会变成/admin/2ea8e923cad.js,就能找到了