nginx部署vue-router history 模式时报 404 nginx try_files 文件路径详解和 vue.config.js中publicPath的作用

问ChatGPT:

你详细解释下try_files 指令?

ChatGPT回答:

当Nginx处理客户端请求时,try_files 指令用于按照指定的顺序尝试查找文件,并在找到匹配的文件时返回内容,或者在没有找到匹配文件时执行备用操作。通常,try_files 指令用于静态文件服务器的配置,以确定如何响应用户请求。

try_files 指令的语法如下:

Copy code

try_files file ... uri;

  • file ...:这是一个或多个文件路径,用空格分隔。Nginx会按照指定的顺序尝试查找这些文件。如果找到了任何一个文件,Nginx将返回该文件的内容。

  • uri:这是备用操作,当找不到匹配的文件时执行。通常,这是一个URL路径,可以是相对路径(相对于服务器的根目录)或绝对路径。

try_files 指令的执行流程如下:

  1. Nginx会按照指定的顺序尝试查找 file 路径中列出的文件。如果找到匹配的文件,它会返回该文件的内容。

  2. 如果在 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;
}区别

rootalias 在 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 路径下查找文件。
  • 如果 URI 路径中包含的目录结构与文件系统路径一致,root 通常能够直接工作

使用 alias

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 和 $uri/

$uri是一种变量,以为着所有上述1.html这类的文件以及1.html/index.html的文件,1.html/ 有点奇怪,换一种 geoip  和 geoip/index.html ,有没有这种没有后缀名的文件?答案是肯定的

这种文件是存在的,当然它也可以是一个文件夹 geoip/index.html ,所以这些类型$uri 和 $uri/都能包含,甚至包括它们的子目录都是这样找文件,要么找到文件返回去,要么找到该目录下的index.html返回去

/forward_uri 

 这个估计绕了很多人,因为上面有个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/dashboard(找不到 dashboard 也找不到 dashboard/index.html)才能被正确 跳转到/admin/index.html 这个文件,该文件已经被浏览器缓存了,所以浏览器不会再次发起请求,而是直接运行本地的 index.html,index.html 中的 js 会获取 URL 栏中的 uri,然后做路由的匹配,实现界面的变化;

js运行起来后,才能识别/admin/dashbord这个路由

vue端为什么要配置 `publicPath:"/admin"` ,因为默认载入的分片 js路径是相对根路径 /的,仍然还是去 /js/2ea8e923cad.js 找,全路径就是

https://xxx.example.com//js/2ea8e923cad.js  这个路径 Nginx 不识别,直接返回 404,实际路径应该是

https://xxx.example.com//admin/js/2ea8e923cad.js  那怎么让 vue 打包出来的代码,能够自动在引入的分片 js 前都自动加上前缀 /admin呢?

那就是要在 vue.config.js 中配置 publicPath:"/admin"即可,这就是 publicPath 的意义。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 将Vue Router的history模式部署Nginx下需要进行一些配置。主要包括以下几步: 1. 在Nginx配置文件,添加一条location规则,将所有匹配到的请求都指向index.html文件。 2. 配置Vue Router的base路径,即Vue.js开发环境在router/index.js文件的base选项,设为Nginx服务的根路径(例如:/project-name/)。 3. 配置Nginxtry_files选项,用于重定向请求到正确的URL。具体方式为将Nginxtry_files选项与Vue Router的fallback选项进行关联。 以上是实现Vue Router history模式Nginx部署的主要步骤。需要注意的是,对于不同版本的NginxVue Router,具体的配置方式可能会有所不同。 ### 回答2: vue router是vue.js的官方路由管理器,是一个非常流行的单页面应用程序(SPA)路由方案。而history模式vue router的一种模式,它使用HTML5 history API将URL映射到应用程序的状态,而不是使用hash来实现路由。使用这种模式可以使URL更加整洁,更易于理解和管理。在nginx部署配置vue router history模式,有以下几个步骤: 1. 在vue项目设置history模式: 在vue项目的router文件,配置路由模式history。在vue-cli创建的脚手架已经默认配置为history模式。 ```javascript const router = new VueRouter({ mode: 'history', routes }) ``` 2. 配置nginx服务器 在nginx服务器上,需要添加一个location来匹配vue路由的所有URL,以保证页面路由能够正确渲染。配置文件需要添加以下代码: ```nginx location / { try_files $uri $uri/ /index.html; } ``` 其$uri指当前请求的URI路径,$uri/指当前URI路径下的子文件夹,index.html是我们设置的vue项目的入口文件。 3. 修改nginx配置文件nginx的配置文件,需要将单页应用所需的页面路由指向正确目录下的静态文件。只有这样,浏览器才会正确显示页面的内容。如果vue项目的build目录下存在静态文件,则需要将静态文件目录和路由路径指向该目录。例如: ```nginx server { listen 80; server_name example.com; root /var/www/example.com; index index.html; location / { try_files $uri $uri/ /index.html; } } ``` 在这个例子vue项目被放置在 /var/www/example.com 目录下。当请求 example.com/about 时,nginx会将请求转发到index.html文件,然后vue.router将根据URL的路径加载对应的组件,最终呈现出关于页面。 总之,在Nginx部署Vue Router history模式需要在vue的router配置history模式并在nginx服务器上添加location来匹配vue路由的所有URL,确保能够正确渲染页面。同时nginx需要将请求转发到index.html文件,并将vue项目放置在/static/目录下。 ### 回答3: Vue Router是Vue.js专用的官方路由,支持hash模式history模式。其history模式不需要“#”符号在URL上,因此被认为是更加符合SEO要求的模式。在Nginx部署这种模式需要以下步骤: 1. 配置Nginx 首先,需要配置Nginx,将所有的URL请求不直接匹配到文件,而是转发至index.html文件。 例如: ``` location / { try_files $uri $uri/ /index.html; } ``` 这段配置指定当请求不是一个文件或目录时,将请求传递至index.html文件。 2. 配置Vue Router 其次,在Vue Router配置文件,需要设置base属性,该属性指定所有URL路径的公共路径,即Nginx的根路径。 例如: ``` const router = new VueRouter({ mode: 'history', base: '/vue-router-demo/', routes: [...] }) ``` 这里的base属性设置为'/vue-router-demo/', 意味着所有路由路径都跟"http://yourdomain.com/vue-router-demo/" URL开头。这个路径应该与Nginx的根路径相匹配。 3. 根据实际情况调整Nginx配置。 最后,需要根据实际情况对Nginx配置进行调整。这可能涉及到解决跨域问题、安全问题、性能优化等问题。 综上所述,Vue Router的history模式Nginx下需要特殊配置,但一旦配置完成,将提供更好的用户体验和SEO效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值