You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Router V6仅根路由/可用,其他路径返回404求助

React-Router V6 多页面应用非根路径404问题解决

问题描述

使用React-Router V6开发多页面React应用时,仅根路径“/”可正常访问,/login、/checkout等其他路径均返回404错误。

相关代码片段

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './components/App.js';
import { BrowserRouter } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);

App.js

import React from 'react';
import Router from './Router';

const App = () => {
  return (
    <div id='app'>
      <Router />
    </div>
  )
}

export default App;

Router.js

import React from 'react';
import { Routes, Route, Link } from 'react-router-dom';
import Login from './Login';
import Checkout from './Checkout';
import History from './History';
import Home from './Home';

const Router = () => {
  return (
  <Routes>
    <Route path='/' element={<Home />} />
    <Route path='login' element={<Login />} />
    <Route path='/history' element={<History />} />
    <Route path='/checkout' element={<Checkout />} />
  </Routes>
  );
}

export default Router;

webpack配置

const path = require('path');
require('dotenv').config();

const clientCofig = {
  mode: 'development',
  entry: {
    path: path.join(__dirname, './client/src/index.js')
  },
  output: {
    path: path.join(__dirname, './client/dist'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /nodeModules/,
        loader: 'babel-loader'
      },
      {
        test:/\.css$/,
        loader: 'css-loader'
      }
    ]
  }
}

module.exports = clientCofig;

核心原因

SPA应用仅存在一个index.html入口文件,当直接在浏览器地址栏输入非根路径时,服务端会尝试寻找对应路径的静态文件,找不到则返回404。需要配置服务端将所有路由请求重定向到index.html,交由React-Router处理路由逻辑。

解决步骤

1. 统一路由路径格式(规范优化)

Router.js中路由路径格式不一致,建议统一使用带前置斜杠的绝对路径:

const Router = () => {
  return (
  <Routes>
    <Route path='/' element={<Home />} />
    <Route path='/login' element={<Login />} />
    <Route path='/history' element={<History />} />
    <Route path='/checkout' element={<Checkout />} />
  </Routes>
  );
}

2. 配置服务端SPA fallback规则

修改server.js,添加路由重定向逻辑(以Express为例):

const express = require('express');
const path = require('path');
const app = express();

// 托管静态文件
app.use(express.static(path.join(__dirname, 'client/dist')));

// 所有路由请求返回index.html,交给React-Router处理
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'client/dist', 'index.html'));
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

3. 简化webpack入口配置(可选优化)

将webpack的entry配置简化为更清晰的写法:

entry: './client/src/index.js',

验证测试

修改完成后重启服务,重新访问localhost:3000/login、localhost:3000/checkout等路径,即可正常渲染对应组件。

内容的提问来源于stack exchange,提问作者ls170292

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:55:16