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

GitHub Pages添加React子页面遇404,用HashRouter仍无效求助

GitHub Pages 部署 React 项目子页面404问题

问题详情

已在GitHub Pages搭建好React页面,主页可正常访问,但子页面直接访问会跳转到404。已经使用HashRouter,但问题依旧:

  • 主页地址:https://pjv17.github.io/frontend-assessment/
  • 子页面地址:https://pjv17.github.io/frontend-assessment/exercise-2

项目代码

index.js

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { HashRouter } from "react-router-dom";
import "bootstrap/dist/css/bootstrap.css";

ReactDOM.createRoot(document.querySelector("#fa-assessment-e1")).render(
  <React.StrictMode>
    <HashRouter>
      <App />
    </HashRouter>
  </React.StrictMode>
);

App.js

import React, { useEffect } from "react";
import "./App.scss";
import { Routes, Route } from "react-router-dom";
import Exercise1 from "./pages/Exercise1";
import Exercise2 from "./pages/Exercise2";

function PageTitle() {
  useEffect(() => {
    document.title = "Frontend Assessment | Exercise 1";
  }, []);
}

function App() {
  PageTitle();
  return (
    <div className="main">
      <Routes>
        <Route path="/" exact element={<Exercise1 />}></Route>
        <Route path="exercise-2" exact element={<Exercise2 />}></Route>
      </Routes>
    </div>
  );
}

export default App;

问题原因与解决方法

核心问题

使用HashRouter时,路由路径会包含#号,但当前访问的子页面地址是不带#的路径,GitHub Pages会把它当成真实的文件路径,找不到对应文件就返回404。

具体修复步骤

  • 用React Router的Link组件跳转:所有页面跳转必须通过Link组件,而非直接输入不带#的URL。比如在Exercise1组件中添加跳转链接:

    import { Link } from "react-router-dom";
    
    // 示例代码
    <Link to="/exercise-2">前往Exercise2</Link>
    

    点击后URL会自动变为https://pjv17.github.io/frontend-assessment/#/exercise-2,这是HashRouter的正确路由格式。

  • 直接访问子页面需带#:如果要直接访问子页面,必须使用带#的完整路由地址:

    https://pjv17.github.io/frontend-assessment/#/exercise-2
    
  • 配置404页面自动重定向(可选):为避免用户误输入不带#的URL看到404,在项目根目录创建404.html,内容如下:

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Redirecting...</title>
        <script>
          const path = window.location.pathname;
          window.location.href = window.location.origin + '/frontend-assessment/#/' + path.split('/').pop();
        </script>
      </head>
      <body>
        Redirecting to the correct page...
      </body>
    </html>
    

    这样用户输入错误地址时会自动重定向到带#的正确路由。

  • 确认路由配置:当前App.js的路由配置无问题,HashRouter会自动适配GitHub Pages的子路径部署,无需额外配置basename。

内容的提问来源于stack exchange,提问作者Never Stop Learning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:45:31