解决React路由URL中hash(#)部分的显示 、browserHistory打包后浏览器刷新页面出现404的问题

摘要

  在React项目中,我们需要采用它的路由库React-Router来进行页面跳转,React会根据路由URL来判断是哪个页面。常见的的URL有两种显示方式,一种是hashHistory的形式,形如:localhost:3000/#/free-lesson的路由,另一种是browserHistory的形式,形如:localhost:3000/person-center的真实URL路由。在实际项目中常常用真实的URL的方式,但是该形式存在一个隐藏的问题,就是项目打包后,浏览器页面刷新会出现404,为了解决这个问题,需要对服务器做简单的改动。

React路由应用真实URL

一、React路由变更

  hash路由形式的URL代码如下:

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import { HashRouter as Router } from "react-router-dom";

ReactDOM.render(
  <Router>
    <App />
  </Router>,
  document.getElementById("root")
);

  hash路由会自带 # 号,我们需要去掉 # 号,将hash路由形式替换为browser路由形式,具体代码如下:

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import { BrowserRouter as Router } from "react-router-dom";

ReactDOM.render(
  <Router>
    <App />
  </Router>,
  document.getElementById("root")
);

二、浏览器页面404解决

  本地运行npm start后,URL为真实的URL,但是npm run build打包项目,上传项目到服务器后,实际项目页面出现404错误。当页面刷新时,浏览器会向服务器请求我们在服务器设置的默认URL,服务器实际会去找根目录下的build好的html文件,发现找不到,因为实际上我们的服务器并没有这样的物理路径/文件等,或者我们没有配置处理这个路由,所以内容无法显示,只有提示404错误。为了解决页面404的问题,我们只需要在服务器上配置处理URL,由于我使用的是nginx,故接下来就讲述如何去配置nginx。

三、Nginx服务器配置

  配置nginx解决页面404错误,只需要访问任何路由地址都访问index.html,这样就可以自动被React-Router处理,并进行无刷新跳转。我们在nginx服务器的location中添加代码行 try_files $uri $uri/ /index.html 即可,部分配合代码如下:

server
{
    listen 80 default_server;
    listen [::]:80 default_server;

    root /usr/local/react/build;  //项目打包代码地址

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name example/test;  //项目服务访问地址

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

原文地址:https://www.cnblogs.com/BlueBerryCode/p/12358140.html

时间: 2024-10-04 14:23:05

解决React路由URL中hash(#)部分的显示 、browserHistory打包后浏览器刷新页面出现404的问题的相关文章

解决webpack打包vue项目后,部署完成后,刷新页面页面404

1.url不动式url完全不动,即你的页面怎么改变,怎么跳转url都不会改变.这种情况的原理 就是纯ajax拿到页面后替换原页面中的元素,刷新页面就是首页 2.带hash(#)式这种相对于第一种的话刷新页面页面不会丢失    实现原理写一个window事件我监听url的变化,那我就能实先路由,那样我就可以根据url的变化,来通过ajax请求参数来渲染页面,一个url对应一个页面,就不会重复.window.addEventListener(‘hashchange‘,function(){self.

解决window.history.go(-1)执行后不刷新页面的问题

在iphone上出现了window.history.go(-1)执行后不刷新页面的问题,安卓不会有这个问题. 解决方法为在返回后的页面加上: window.addEventListener('pageshow', function(e) { //如果检测到页面是从“往返缓存”中读取的,刷新页面 if (e.persisted) { window.location.reload(); } }); 原文地址:https://www.cnblogs.com/luoyihao/p/12665868.ht

解决JS在url中传递参数时参数包含中文乱码的问题

需要经过两次encodeURI()编码和两次decodeURI()解码, 使用encodeURI()编码时, var searchType = $("#type_select option:selected").val();//"基地动态" var searchContent = $("#search_val").val();//"aaaa" var url = encodeURI("TextSearchDetail

vue-router+webpack线上部署时单页项目路由,刷新页面出现404问题

使用vue项目,线上部署的时候,访问首页以及通过路由打开二级页面没有问题,但是一刷新就出现404现象 因为刷新页面时访问的资源在服务端找不到,因为vue-router设置的路由不是真实存在的路径. 解决办法是:在nginx.conf配置修改如下: location / { root html; try_files $uri $uri/ @router; index index.html index.htm; } location @router { rewrite ^.*$ /index.htm

解决Ubuntu 9.10中vim和gedit显示中文乱码

当你刚装完Ubuntu或者debian的时候,你会发现gedit和vim打开中文都会乱码,下面是解决方法 打开vim的配置文件,位置在/etc/vim/vimrc 在其中加入 set fileencodings=utf-8,gb2312,gbk,gb18030 set termencoding=utf-8 set encoding=prc 保存退出,此时vim就能正确显示中文了. 对于gedit,解决方法如下: 在终端中运行 gconf-editor 在打开的界面中选择: apps->gedit

解决ASP.NET MVC4中使用Html.DropDownListFor显示枚举值默认项问题

从ASP.NET MVC 5开始,Html.DropDownListFor已经提供了对Enum的支持,但在这以前,需要通过帮助方法或扩展方法来让Html.DropDownListFor显示枚举值. 本篇解决在ASP.NET MVC 4 下Html.DropDownListFor显示默认项的问题. 以上,使用Select是通过Html.DropDownListFor来实现的,Select的选项值是从枚举中读出.可以看到,某个枚举值成了默认选项,而我想让"==请选择=="成为Select的

解决Java Web项目中Word、Excel等二进制文件编译后无法打开的问题

今天写新项目的时候遇到一个问题,在resources目录下存储的.xlsx文件,编译过后会增大几kb,无法打开. Google了一番之后,发现问题源自于maven-resources-plugin这个插件.这个插件会把resources目录下的文本文件进行转码,但它无法正确的识别哪些是文本文件,因而会错误的将不需要进行转码的二进制文件也进行转码,导致这些二进制文件无法打开. 解决的方法是在pom.xml中的maven-resources-plugin下,将不需要转码的文件扩展名填入nonFilt

keep-alive 路由跳转后不刷新页面

使用keep-alive记住了状态 通过路由跳转并且携带了参数,之前this.$route.params.list卸载mounted中,第一次进入能够更新,但是后面再次进入就不会更新了. 借用别人的话 当引入keep-alive 的时候,页面第一次进入,钩子的触发顺序created-> mounted-> activated,退出时触发deactivated.当再次进入(前进或者后退)时,只触发activated. 所以将方法写在 activated中

vue中如何不通过路由直接获取url中的参数

前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接在url后面拼接?mid=100的方式传递参数更灵活,你不需要设置路由,只需要在url后拼接参数即可,但是这种方式就需要通过javascript获取并提取url中的参数,通过传统的方式直接在页面中获取是行不通的了,因为vue中是无法通过location.search()来获取url问号之后的内容的.