react单页面应用本地开发环境下刷新会停留在当页,部署在服务器上刷新404

有个react写的SPA,npm start运行项目的时候起的本地服务器,进入项目,再点击进入详情页,通过路由切换,访问的是这个页面,http://192.168.0.110:3002/det...刷新后还是这个页面。

但是我一打包后,放到服务器根目录下,进入项目,进入详情页,都没问题,但是刷新后显示404。

就是因为打包后根目录就一个index.html文件,找不到那个detail文件了。我现在想实现服务器上刷新页面还是停留在当页,有办法解决吗?难道单页面应用不能刷新??

阅读 5.7k
2 个回答

谢邀!
单页面应用应该放到nginx或者apache、tomcat等web代理服务器中,同时要根据 自己服务器的项目路径 更改react的路由地址。
如果说项目是直接跟在域名后面的,比如:http://www.sosout.com ,根路由就是 '/'。
如果说项目是直接跟在域名后面的一个子目录中的,比如:http://www.sosout.com/children ,根路由就是 '/children ',不能直接访问index.html。

以配置Nginx为例,配置过程大致如下:
(假设:
1、项目文件目录: /mnt/html/reactAntd(reactAntd目录下的文件就是执行了npm run dist 后生成的antd目录下的文件)
2、访问域名:antd.sosout.com
进入nginx.conf新增如下配置:

server {
    listen 80;
    server_name  antd.sosout.com;
    root /mnt/html/reactAntd;
    index index.html;
    location ~ ^/favicon\.ico$ {
        root /mnt/html/reactAntd;
    }

    location / {
        try_files $uri $uri/ /index.html;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto  $scheme;
    }
    access_log  /mnt/logs/nginx/access.log  main;
}

注意事项:
1、配置域名的话,需要80端口,成功后,只要访问域名即可访问的项目
2、如果你使用了react-router的browserHistory 模式,在nginx配置还需要重写路由:

server {
    listen 80;
    server_name  antd.sosout.com;
    root /mnt/html/reactAntd;
    index index.html;
    location ~ ^/favicon\.ico$ {
        root /mnt/html/reactAntd;
    }

    location / {
        try_files $uri $uri/ @fallback;
        index index.html;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto  $scheme;
    }
    location @fallback {
        rewrite ^.*$ /index.html break;
    }
    access_log  /mnt/logs/nginx/access.log  main;
}

为什么要重写路由?因为我们的项目只有一个根入口,当输入类似/home的url时,如果找不到对应的页面,nginx会尝试加载index.html,这是通过react-router就能正确的匹配我们输入的/home路由,从而显示正确的home页面,如果browserHistory模式的项目没有配置上述内容,会出现404的情况。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题