nginx服务器配置React的Browser路由模式,并避免出现404

前言

React路由模式分为两种:

hashHistory:

比如 http://localhost:8080/#/login

browserHistory

比如 http://localhost:8080/login

browserHistory的好处大于hashHistory, 但是麻烦的地方就是,browserHistory路由模式,需要服务器的配置:

请求 http://localhost:8080/login 上的资源的时候,服务器会默认搜索当前目录下的login文件夹里的资源。但是logIn这个目录其实是不存在的,往往在刷新浏览器的时候,会404Not fund

所以需要利用 nginx 里面的 try_files 去指定一个 fall back 资源;

1、React router配置
import React from 'react';
import { Route, Switch, BrowserRouter as Router } from 'react-router-dom';

import App from '@pages/App';

function About(props) {
    console.log('about', props);
    return <div>page: about</div>;
}

// 路由配置
const routerConfig = [
    {
        path: '/',
        component: App
    },
    {
        path: '/about',
        component: About
    }
];

function AppRouter() {
    return (
        // 只有当你的应用部署到服务器的二级目录的时候,才需要设置basename
        <Router basename="/react">
            <Switch>
                {routerConfig.map(n => {
                    return <Route path={n.path} exact component={n.component}></Route>;
                })}
            </Switch>
        </Router>
    );
}

export default AppRouter;

我这里在服务器配置了二级目录 react 作为请求目录,所以这里的 basename 需要配置成 /react。如果你的静态资源已经是在根目录是不需要设置这个的。

启动本地服务:

about

这个时候从首页点击跳到 about ,就能看到这种路由模式的路径了;

此时如果你刷新了浏览器,将会提示找不到about目录:

在这里插入图片描述

此时可以在webpack.config.js里面增加:

devServer {
	historyApiFallback: true
}

webpack 里面的 historyApiFallback 使用的是connect-history-api-fallback:

重启本地服务,再次刷新正常。

关于 connect-history-api-fallback

单页应用(SPA)一般只有一个index.html, 导航的跳转都是基于HTML5 History API,当用户在越过index.html 页面直接访问这个地址或是通过浏览器的刷新按钮重新获取时,就会出现404问题;

比如 直接访问 /login, /login/online,这时候越过了index.html,去查找这个地址下的文件。由于这是个一个单页应用,最终结果肯定是查找失败,返回一个404错误。

这个中间件就是用来解决这个问题的

只要满足下面四个条件之一,这个中间件就会改变请求的地址,指向到默认的 index.html:

1 GET请求

2 接受内容格式为 text/html

3 不是一个直接的文件请求,比如路径中不带有 .

4 没有 options.rewrites 里的正则匹配

2、nginx 配置
location /react {
    alias /project/react/;
    # browserHistory模式 404问题
    try_files $uri $uri/ /react/index.html;
    index index.html;
    autoindex on;
    gzip on;
    add_header Access-Control-Allow-Origin '*';
    add_header Access-Control-Allow-Methods 'GET, POST, PUT, OPTIONS';
    add_header Access-Control-Expose-Headers 'Accept-Ranges, Content-Encoding, Content-Length, Content-Range';
  }

autoindex on; 开启这个,输入到/react 会直接定向到index.html;

try_files 主要解决的是,如果在一些目录下找不到 index.html, 会最终有一个保底资源的路径就是 /react/index.html;

try_files $uri $uri/ /react/index.html;

浏览器输入 http://**:6002/react/about

会先查找 http://**:6002/react/about 是否有文件about.html存在;再查找/about/下是否有文件存在,如果都不存在,启动 /react/index.html;

try_files 增加 $uri/ 可以解决 try_files autoindex同时存在的时候,再输入/react 不会自动定向到index.html的问题

参考文档
  1. connect-history-api-fallback

  2. nginx ~ try_files

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用React部署到Nginx时,如果直接访问页面出现404错误,可能是由于配置问题引起的。以下是一些可能的解决方案: 1. 检查Nginx配置文件:确保在Nginx配置文件中设置了正确的根目录,并且指向React项目的构建文件夹。例如,如果项目构建后生成的文件夹名为“build”,则Nginx配置文件中的根目录应该是指向这个文件夹的路径。 2. 配置路由规则:当使用React路由时,需要在Nginx配置文件中设置一些路由规则,以便正确地处理页面间的导航。这通常涉及使用try_files指令。例如,将下面的代码段添加到Nginx配置文件的服务器块中: ``` location / { try_files $uri /index.html; } ``` 这将确保无论访问的是哪个URL,Nginx都会返回index.html文件,然后React路由器将负责渲染正确的页面。 3. 确保React项目已正确构建:在部署到Nginx之前,确保React项目已经正确地构建。使用`npm run build`命令来生成构建文件夹,并确保在Nginx配置中指向了正确的构建文件夹。 4. 重启Nginx服务:在修改Nginx配置文件后,需要重启Nginx服务以使更改生效。使用`sudo service nginx restart`命令来重新启动Nginx。 如果以上解决方案都没有解决问题,还可以检查Nginx的错误日志,以了解详细的错误信息。日志文件通常位于`/var/log/nginx/error.log`。检查错误日志可能有助于进一步诊断并解决404错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值