解决 Vue.js 单页面项目部署后刷新页面报错

分类:Linux 评论: 0

Vue.js 项目部署后,在部分页面内刷新会报错。

起因

单页面 Vue.js 项目部署后,在部分页面内刷新会报错。

访问举例地址:https://www.domain.com/web/dashang/mall/

点击其中页面后路径变为 https://www.domain.com/web/dashang/mall/activity?VNK=2d91cc2f

探索

项目目录结构为

[root@test ~]# cd /usr/share/nginx/html/dist/
[root@test dist]# ll
total 4
-rw-r--r-- 1 root root 596 Jul  1 00:01 index.html

小贴士:其他静态资源因为使用了 CDN 缓存,可以看到只有一个 index 入口文件。

CDN 目录树

.
├── dashang
│   ├── css
│   │   └── app.ec9f8b08af26e8fd771d084786f0abb4.css
│   ├── js
│   │   ├── app.1ca72947f4fa553557f2.js
│   │   ├── manifest.a32e1a72d5bb4bf2a958.js
│   │   └── vendor.4591f916de0802a4b319.js
│   ├── img
│   │   ├── iconfont.3bb5127.svg
│   │   ├── nowdirc.png
│   │   └── ytx
│   │       ├── HomeText.jpg
│   │       ├── activeBg.png
│   │       ├── .
│   │       ├── .
│   │       ├── .
│   │       └── activeOne.png
│   ├── fonts
│   │   ├── element-icons.535877f.woff
│   │   └── iconfont.8f18d23.eot

刷新页面会发现 404 报错,这是因为 Vue.js 项目中 react-router 设置的路径并不是实际存在的文件路径。这些访问路径是在 JS 中渲染的,并不实际存在。

解决

将 NGINX 的首页跳转规则正确跳转即可,将 react-route 的地址进行重定向即可。

server {
    listen       80;
    server_name  www.domain.com;

    location / {
        root   /usr/share/nginx/html/dist;
        try_files $uri $uri/ @router;
        index  index.html;
    }

    location @router{
        rewrite ^.*$ /index.html last;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /data/projects/localhost;
        }
}

附录

参考链接

回复