BrowserRoute服务器配置
BrowserRoute服务器配置
在React项目中我们经常需要采用React-Router来配置我们的页面路由,React-Router 是建立在 history 之上的,常见的history路由方案有三种形式,分别是:
1)hashHistory
2)browserHistory
3)createMemoryHistory
hashHistory 使用 URL 中的 hash(#)部分去创建形如 example.com/#/some/path 的路由。
browserHistory是使用 React-Router 的应用推荐的 history方案。它使用浏览器中的 History API 用于处理 URL,创建一个像example.com/list/123这样真实的 URL 。
import React from "react";
import ReactDOM from "react-dom";
import { Router, Route, IndexRoute, Link, IndexLink, browserHistory} from 'react-router'; import Index from "../routes/HelloWorld";
import List from "../routes/BlogList";
import About from "../routes/About"; class App extends React.Component {
render() {
return (
<div>
<ul>
<li><IndexLink to="/">首页</IndexLink></li>
<li><Link to="/list">List</Link></li>
<li><Link to="/about">About</Link></li>
</ul>
{this.props.children}
</div>
);
}
} ReactDOM.render(
<Router history = {browserHistory}>
<Route path="/" component={App}>
<IndexRoute component={Index}/>
<Route path="list" component={List}/>
<Route path="about" component={About}/>
</Route>
</Router>,
document.getElementById("APP")
);
但是我们当我们采用browserHistory方案时,通常会遇到浏览器刷新404 的问题。
一、问题描述
在React + React-router实现的SPA(单页面应用)项目中,当我们路由模式采用browserHistory时,点击每个导航都可以显示正确的页面,一旦浏览器刷新,页面就显示Cannot GET(404)。
如当我们点击List链接,进入List页面之后,正常显示List页面内容,这时如果我们刷新页面,页面将会出错,返回Cannot GET /list。
二、问题分析
当刷新页面时,浏览器会向服务器请求example.com/list,服务器实际会去找根目录下list.html这个文件,发现找不到,因为实际上我们的服务器并没有这样的 物理路径/文件 或没有配置处理这个路由,所有内容都是通过React-Router去渲染React组件,自然会报404错误。这种情况我们可以通过配置Nginx或通过自建Node服务器来解决。
三、Nginx方式
采用Nginx方案需要先将所有资源打包生成到对应的目录,比如dist,然后做如下配置:
server {
server_name react.thinktxt.com;
listen 80;
root /Users/txBoy/WEB-Project/React-Demo/dist;
index index.html;
location / {
try_files $uri /index.html;
}
}
通过配置Nginx,访问任何URI都指向index.html,浏览器上的path,会自动被React-router处理,进行无刷新跳转。
四、通过修改webpack-dev-server运行方式
这个解决方法很简单,直接在运行时加入参数“–history-api-fallback”就可以了。我们修改package.json相关的代码:
"scripts": {
"build": "webpack",
"dev": "webpack-dev-server --inline --devtool eval --progress --colors --hot --content-base ./build --history-api-fallback"
},
五、Node服务端配置
一个express应用的配置示例:
const express = require('express');
const path = require('path');
const port = process.env.PORT || 8080;
const app = express();
//加载指定目录静态资源
app.use(express.static(__dirname + '/dist'))
//配置任何请求都转到index.html,而index.html会根据React-Router规则去匹配任何一个route
app.get('*', function (request, response){
response.sendFile(path.resolve(__dirname, 'dist', 'index.html'))
})
app.listen(port, function () {
console.log("server started on port " + port)
})
一个Koa应用的配置示例:
import Koa from 'koa';
import xtpl from 'koa-xtpl';
import path from 'path'; const app = new Koa();
const port = process.env.PORT || 8081; app.use(xtpl({
root: path.resolve(__dirname, '../dist'),
extname: 'html',
commands: {}
})); app.use(async(ctx, next) => {
await ctx.render('index', {});
}); app.listen(port, () => {
console.log('Server started on port' + port);
});
注意: 由于koa的这种方式端口与webpack-dev-server(8080)必须不同,所以还需要配合Nginx代理。例如:
server {
server_name react.thinktxt.com;
listen 80;
location / {
proxy_pass http://localhost:8081;
}
}
server {
server_name static.react.thinktxt.com;
listen 80;
location / {
proxy_pass http://localhost:8080;
}
}
既然我们的Nginx代理用了真实域名,自然别忘了修改一下host,如下:
127.0.0.1 react.thinktxt.com
127.0.0.1 static.react.thinktxt.com
这样我们就大功告成了,可以happy的在地址栏直接访问任何采用browserHistory方式配置的路由页面了。
BrowserRoute服务器配置的更多相关文章
- Linux服务器配置之加载硬盘
Linux服务器配置之加载硬盘 1.修改密码 passwd 2.测试密码是否成功 3.查看硬盘信息 fdisk –l 4.格式化分区 fdisk /dev/vdb 5.查看分区 6.快速格式化/dev ...
- Windows Server 2008 R2 WEB服务器配置系列文章索引
最近这段时间趁天翼云1元主机活动,购买了一个1元主机,主要是为了写一些服务器配置的教程. 已经完成如下几篇文章,送给大家. 国内云主机比较 天翼云/阿里云/腾讯云 Windows Server 200 ...
- Window下python2.7+Apache+mod_wsgi+Django服务器配置
前言:试着使用python搭建一个网页,分别在windows下和linux下,本篇文章主要讲解Window下python+Apache+mod_wsgi+Django服务器配置过程中遇见的问题和解决方 ...
- Samba服务器配置
Samba服务器配置流程: (1)安装samba服务器先用#rpm -ivh samba-列出与samba有关的rpm包然后选择第一个包,用tab键补齐文件名 (2)创建新用户和其密码#useradd ...
- 【原创】我所理解的自动更新-外网web服务器配置
ClientDownload和ClientUpdate共享渠道配置信息: channel-0.php //以appstore的渠道为例 <?php define('APPNAME', 'TOKE ...
- iOS app 企业内部发布及HTTPS服务器配置
转自: http://www.cnblogs.com/cocoajin/p/4082488.html iOS企业内部发布及HTTPS服务器配置 一:所需的条件 1. 苹果开发者证书,企业版 299$ ...
- django服务器配置
服务器配置是Ubuntu14.04 64位OS ubuntu14.04默认是安装好了python2.7版本不用自己安装了. 先更新下源 sudo apt-get update 第一步先安装pip su ...
- "错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法
[详细报错如下]: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致 ...
- VS2012 asp.net mvc 4 运行项目提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败"
创建mvc4 应用程序发布,运行出错.出现未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭,后来找得解决方法: 打开点站的web.confg文件,将: <authorizati ...
随机推荐
- 评分模型的检验方法和标准&信用评分及实现
评分模型的检验方法和标准通常有:K-S指标.交换曲线.AR值.Gini数等.例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成 ...
- Nop--NopCommerce源码架构详解专题目录
最近在研究外国优秀的ASP.NET mvc电子商务网站系统NopCommerce源码架构.这个系统无论是代码组织结构.思想及分层都值得我们学习.对于没有一定开发经验的人要完全搞懂这个源码还是有一定的难 ...
- Effective Java 第三版——80. EXECUTORS, TASKS, STREAMS 优于线程
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 【转载】VMware虚拟机NAT模式网络配置图文教程
原文:https://blog.csdn.net/dingguanyi/article/details/77829085 一.引言 在Windows上搭建集群实验环境时,为能够让集群结点之间相互通信, ...
- Android 手机版 ssr
看上去比windows客户端多了很多选项,但实际上只需要设置这五个: 链接:https://pan.baidu.com/s/1PKL0ViJJRJw9zkG8AlvEdQ 提取码:p175 操作步骤: ...
- oracle 函数 输入值,查询数据,返回相应处理结果
create or replace function FUN_SEARCH_ORDERBY ( INSTACEID in varchar2,TYE IN varchar2) return varcha ...
- [db]mysql全量迁移db
机房要裁撤, 原有的老业务机的mysql需要迁移到新的. 方案1: 全量打包拷贝data目录, 发现拷过去各种毛病 方案2: mysqldump逻辑导出解决问题 新的db刚安装好. 步骤记录下. # ...
- XML格式化工具
做接口开发的时候,往往接受参数或返回值是一个XML的字符串.如下图,不方便辨识 两种方法, 1.将它保存为xxx.xml,然后用浏览器打开.这种方法稍微有些麻烦. 2.使用 UltraEdit 工具
- 纯CSS3浮雕质感的立体文字旋转动画
还记得之前分享过一个CSS3 文字3D翻转特效,这个效果让文字有一种立体的视觉效果.今天要分享的这款CSS3文字动画特效更加炫酷,它不仅有立体的3D效果,而且文字整体展现出一种浮雕质感的视觉效果,并且 ...
- 一对一voip,直播连麦,在线会议,兼容webrtc,IM音视频
功能 IM消息系统 一对一 高清音视频实时通信,可无缝切换P2P传输,节省服务器带宽 一对多互动直播 多对多在线会议 手机实时录屏传输 高度定制化 网络检测,动态码率与动态帧率,抗网络抖动,微信级效果 ...