在搭建项目的时候,很多前端小伙伴在选择路由模式的时候会嫌弃hash
而偏爱history
模式,因为hash
模式的网址看起来“不正规”,里面总是有个难看的#
,而history
模式就没有这个问题。
但接下来往往会发生这么一种情况,自己高高兴兴敲完代码后打包部署到测试环境,这里点点哪里点点,看起来一切正常,直到测试同学用他那开过光的手点了下F5
。
Duang!Nginx
返回的404page
把你干懵了!
不可能吧,开发环境明明是好好的啊!
可能你知道这是history
模式的锅,只是简单的知道后端服务器要做一些专门的配置来适应这种模式,但如何配置却不知道,也因为不了解原理不知道如何跟后端沟通叫后端配置,所以改回hash
模式,从此对history
敬而远之。又或者根本不知道是这个模式的锅,而在错误的道路上越走越远,一直走,一直掉沟里。
首先要确认的是,history
模式在生产环境极有可能会出现刷新无法找到页面的情况,因为一般情况下,Nginx
并不会对这种情况做配置。如果你折腾过一点Nginx
,了解些皮毛,你会在/config/nginx.conf
中发现如下配置:
location / {
root html;
index index.html index.htm;
}
这个配置的大概意思就是你访问/
路径的时候,Nginx
会匹配返回index.htm
的资源,这种匹配逻辑在hash
模式中不会产生问题,因为该模式,你不管这么折腾,url
都没有变化。http://test.example.com:3000/#/
和http://test.example.com:3000/#/about
的pathName
都是/
。所以在刷新页面时,Nginx
在匹配资源时遇上pathName
为/
时总是返回index.html
。而在history
模式里,http://test.example.com:3000/
的pathName
是/
,http://test.example.com:3000/about
的pathName
的pathName
是/about
。所以当你在http://test.example.com:3000/
页刷新时,不会出现任何问题,会匹配上/
返回index.html
,而http://test.example.com:3000/about
页面刷新时,因pathName
变成了/about
,而ngxin
中并没有设置/about
的匹配规则,这个时候就会返回404page
了。
开发环境中没有出现这个问题的原因是因为开发服务器对这个做了设置,所以不用操心。但测试和生产一般用的是nginx
之类的服务器,所以需要配置。
怎么配置呢?
有两种思路,一种是穷举
,一种是一锅端
。
穷举
就是把所有代码中会产生的pathName
列出来,让其都指向index.html
。一锅端
就是不管你什么pathName
我都给指向index.html
。穷举
繁杂,但有有个优势,就是可以照旧配置404page
,一锅端
省事,但你再怎么折腾都看不到nginx
返回的404page
了,因为所有不管是正常的还是异常的请求都被指向到了index.hmtl
页面。不过这个可以通过vue-router
的路由设置弥补,就是不匹配的时候指向项目自身的404page
页。
一锅端
的方式需要将上面Nginx
的配置做一点小调整。
location / {
root html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
网友评论