history模式 nginx配置_Nginx与Vue

本文介绍了在Vue.js的history模式下,如何配置nginx以解决不能直接通过location /访问,以及点击浏览器刷新出现空白页的问题。文章详细阐述了assetsPublicPath和vue-router的base属性设置,以及nginx配置中的location规则,包括对static文件的访问路径调整。
摘要由CSDN通过智能技术生成

这篇文章主要是在说两个内容:

    1. 如果编译后的vue不能通过 location / 来访问,必须通过 location /xxx 或者 location /xxx/xxx 这种方式访问,该如何配置vue和nginx。

    2. 如何解决nginx配置完vue后,除了首页内容,其他页面点击浏览器刷新操作会出现空白页面。

对于如何使用nginx作为服务器访问编译好的vue.js网上应该能找到一大堆,但是大部分都是C-C、C-V作品,略微浪费时间。本来我也打算从官网 (https://vuejs.org )C-C一个小例子出来,无奈找了10来分钟硬是没找到。有兴趣可以去试下看能不能再10分钟之内找到如何与nginx搭配使用。官方文档地址:https://cn.vuejs.org/v2/guide/installation.html

这个真是有点嘲讽了。。。。

既然官方故意搞个这么难找,那没办法我们只有自己造轮子了。

首先要明确的是,我们一般使用vue-cli构建vue项目。vue-cli不是本文重点,自行了解。

在我们写完vue.js代码之后,会将代码编译。一般执行如下命令:

npm run build  (如果使用yarn另说,本文以npm为例)

编译完成后会在项目根目录(src所在的目录就是根目录)生成一个dist文件(前提是你不对webpack编译做改动)

dist文件中会生成一个index.html和static文件,static文件中存放的是js和css。我们使用nginx进行访问的也就是dist文件中的内容。

下面来看一个简单的配置。

正常情况下nginx配置一个location即可。即:

location / {    root   /xxx;       index  index.html;         try_files $uri $uri/ /index.html; }

root指向的是nginx当前这个location要访问的目录。如果你按照上述配置nginx之后,那你在浏览器中应该直接输入 http://host:port   host是域名、port是端口号(如果你的端口号是80,那在浏览器中可以不用写port,即http://host )。

如果事情都是这么简单就好了,但这个世界就是会因为一些各种原因的历史问题,导致我们不得不调整我们自己去适应。

我现在接手的这个项目是略微费劲的。我们的线上服务需要先通过别人站点的转发来到达我们自己的入口页面,但由于历史原因我们之前的代码是PHP+HTML,即前后端代码糅合在一起的。现在我们通过vue将后端代码剔除了,然后又将一部分PHP改用了Java来实现。但是我们的PHP服务还有一些老的数据在用,暂时无法下线。瞬间感觉这个世界充满了恶意。。。。

鉴于此,我们只能保留PHP的入口来下发vue编译后的index.html和static文件。具体就是当别人站点跳转到我们站点的时候我们以PHP中的一个入口方法来接收(基本PHP框架都会有一个这种方法),然后将这次请求重定向到vue编译后的index.html和static文件。如何重定向呢?那就要在nginx中配置了。

扯了这么多,感觉好像跑题了,权当吐槽吧。

我们还是回到主题吧?。

正常情况下的nginx配置我们在上文中已经介绍过了,下面我们来看看不正常的配置。

我们来看下编译配置中几个比较重要的属性

7035bcd68d3bad847172834222ef24fa.png

如图build中的属性即使你在执行npm run build时候为什么会生成一个叫dist的目录,为什么会生成一个index.html和一个叫static的文件。注意新的编译配置可能和我截图不一致,但是其assetsRoot、assetsSubDirectory、assetsPublicPath 这几个属性还是一样的。这几个属性即是我们配置nginx是最需要注意的属性。

比如说我们的需求不再是直接访问 http://host 而是要输入http://host/test/v1/ 来访问站点首页。那我们如何配置呢?

这种情况下我们要修改 assetsPublicPath 这个属性,即将其值设置为 /test/v1/,此时你可以打开看一下编译好后的index.html,在里面会访问static中的js和css,访问方式变成了/test/v1/static/xxxx 。(明白了吧,这个 assetsPublicPath 的值就是你访问js和css文件的地址)然后如果你使用了vue-root 作为路由插件也要将其base属性设置为 /test/v1/ 这样你才能正确的跳转到其他页面(此处vue-root使用的是history模式,如果你硬要使用hash模式,那就不要浪费时间看这篇文章了,这病我救不了?)。

vue的编译配置这样就配置结束了,接下来是nginx的配置。如何配置nginx呢?

前文说过,正常的nginx配置就是简单的一个 location,但是我们现在改了 assetsPublicPath 这个属性的值,那我们就需要对nginx做点修改。首先我们需要单独加一个location来访问static文件。可以这样写

location /test/v1/static {    alias /xxx/test/v1/static/;}

前文说了,我们打开编译后的 /dist/index.html 后会看到js和css静态文件的访问地址,这个新配置的 /test/v1/static 即是将所有访问 host/test/v1/static 的请求,都指向 /xxx/test/v1/static/ 这个服务器路径去寻找js和css静态文件。

除此之外我们还要修改原有location,我们的原有location是这样的:

location / {    root   /xxx;       index  index.html;         try_files $uri $uri/ /index.html; }

我们要将其改为

localtion /test/v1 {    alias /mmm/;   # "/mmm/" 就是你编译后的index.html的所在目录    index index.html;    # 此处不再是单纯的index.html, 如果是单纯的index.html,那你除了首页之外的其他页面只要一点浏览器的刷新就会白屏?(这里也是为啥网上会有人问nginx+vue除了首页其他页面刷新后什么都没有的原因)    try_files $uri $uri/ /test/v1/index.html;  }

至此,我们算是终于配置完了,撒花。

明明可以通过很简单的配置就可以完事,但由于种种原因导致配置绕来绕去。

不知道这算是好事还是坏事呢。

正如我们的生活,往往很简单的事情,有时候总被我们人为的搞的很复杂。

这到底是幸运还是不幸呢。

我们都身处在这样一个复杂的社会中,很想坚持做自己,但大多时候我们又会无能为力的选择妥协。

记得罗翔大律师说过的话:我们读书可以不是为了炫耀,可以不是为了功利,我们读书是希望当我们的人生跌入低谷时仍会有勇气去面对这一切。

罗曼·罗兰:

There is only one heroism in the world : it's to see the world as it is, and to love it.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Vue中使用history模式,您需要对Nginx进行配置以正确处理路由请求。 首先,您需要在Vue的路由器中启用history模式,可以通过以下方式完成: ``` const router = new VueRouter({ mode: 'history', routes: [...] }) ``` 然后,在Nginx配置文件中添加以下代码: ``` location / { try_files $uri $uri/ /index.html; } ``` 这将确保当Nginx服务器接收到路由请求时,它将返回Vue应用程序的index.html文件,并允许Vue路由器处理请求。 最后,确保重新加载Nginx服务器以使更改生效: ``` sudo service nginx reload ``` 这样就完成了Vue history模式Nginx配置。现在,您应该能够使用Vue的路由器进行导航,并且当用户刷新页面或直接访问路由时,Nginx将正确地将请求发送到Vue应用程序。 ### 回答2: Vue是基于组件化开发的JavaScript框架,常用于构建单页面应用(SPA)。Vue提供了路由功能,方便前端开发实现页面之间的路由跳转。其中,Vue的路由模式有两种,一种是hash模式,一种是history模式。在hash模式下,URL中带有#号,如http://localhost/#/home,而在history模式下,URL是真实的路径,如http://localhost/home。在实际开发中,history模式更加友好,更符合我们对URL的期望,但需要特殊的nginx配置。 要在Vue中使用history模式,需要先设置VueRouter的mode属性为history。具体方法如下: ``` javascript import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) const router = new Router({ mode: 'history', routes: [...] }) ``` 设置完后,Vue会使用HTML5的History API来实现前端路由。 接下来,我们需要在nginx服务器中进行配置,来支持history模式nginx是一个开源的高性能Web服务器软件,常被用于作为静态资源服务器和反向代理服务器。我们需要在nginx配置文件中添加以下内容: ``` nginx server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } } ``` 在这里,我们设置了一个nginx的server块,并监听80端口。location /表示匹配到的所有路径,root指定了网站的根目录,index指定默认的访问页面。try_files语句表示当nginx找不到对应的静态资源时,将会跳转到index.html页面,这就是Vue使用history模式所需的。 同时,为了让Nginx生效,我们需要执行以下命令,重新加载nginx配置:sudo nginx -s reload 总结:通过Vuehistory模式,我们可以实现更美观、更友好的URL路径,但需要在nginx服务器中进行配置。通过以上的方法,我们可以轻松实现history模式nginx配置,使我们可以愉快地在Vue中使用history模式了。 ### 回答3: Vue是一款现代化、轻量级且非常有用的前端框架,可以让开发者迅速地创建高质量的单页应用程序。而Vue Router是Vue框架的官方路由管理器,可以帮助我们处理应用程序中的所有路由。 Vue Router支持两种路由模式:Hash模式History模式,其中Hash模式就是默认的模式,而History模式则需要对服务器端和Nginx进行一些配置。 当我们使用Vue Router的History模式时,需要确保我们已经在服务器端正确地配置了路由。这样才能确保我们在浏览器中访问特定页面时,服务器能够正确地响应相关路由。 在Nginx配置Vue Router的History模式非常简单,只需在服务器端的Nginx配置文件中添加以下代码: ``` location / { try_files $uri $uri/ /index.html; } ``` 这段代码的意思是,当请求的URL与文件系统中的文件或目录匹配时,直接返回该文件或目录的内容。如果无法匹配,就返回/index.html中的内容。 这样,当我们在浏览器中访问特定的路由时,Nginx就会返回/index.html的内容,而Vue Router会根据我们的路由配置去渲染对应的组件。这样就能保证Vue Router的History模式正常工作。 总的来说,虽然Nginx配置比较简单,但是我们还是需要正确地配置以确保Vue Router的History模式能够正常运行。只有这样,我们才能在开发原型和生产环境中使用Vue框架和Vue Router,实现快速、高效的前端开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值