尝试输入反应应用程序路由时出现 404

Posted

技术标签:

【中文标题】尝试输入反应应用程序路由时出现 404【英文标题】:404 when trying to enter a react app route 【发布时间】:2020-09-14 17:57:40 【问题描述】:

我刚刚在 c-panel 上部署了我的 react 应用构建。该应用程序包含不同的路线,每次我尝试到达其中之一时,我都会得到404 Not found。 例如,如果我尝试访问http://example.com/,它将进入网站,如果我按下链接到http://example.com/articles 的按钮,它将起作用。但是,如果我尝试从我共享的链接中获取http://example.com/articles,或者只是输入此地址,我将得到404 Not found。当我在 localhost 上运行开发模式时,不会发生这种情况。

我更改了 package.json 中的主页 url - "homepage": "http://example.com", 并没有效果。

我的应用根目录用 <Router> 包裹

function App() 
  return (
    <Provider store=store>
      <Router>
        <React.Fragment>
          <CssBaseline />
          <Header title="exampletitle" />
          <MobileHeader />
          <Main />
          <BottomNavbar />
        </React.Fragment>
      </Router>
    </Provider>
  );

这是由路由操纵的 Main.js 组件。

function Main(props) 
  return (
    <div>
      <Switch>
        <Route exact path="/" component=Homepage />
        <Route exact path="/about" component=About />
        <Route exact path="/signup" component=Registerpage />
        <Route exact path="/ap" component=Adminpage />
        <Route exact path="/signin" component=SignIn />
        <Route exact path="/userpanel" component=UserPanelPage />
        <Route path="/article/:category" component=Articlepage />
        <Route path="/articlepage/:id" component=ReadArticlePage />
      </Switch>
    </div>
  );

当我通过链接直接输入这些页面时,有人可以告诉我如何加载这些页面吗?

【问题讨论】:

您拥有最接近articlespath="/article/:category"。可能是笔误。或者它尝试从后端渲染路由,这就是为什么它是 404 @norbitrial 我不是专门谈论这条路线。所有路线都在做同样的事情。 可能是后端试图寻找路线,我已经解释了类似的场景in this answer,也许这有助于理解发生了什么。 【参考方案1】:

如果您的应用程序在您使用&lt;Link&gt;history.push 导航时适用于所有路由,但在您键入http://example.com 以外的URL 时抛出404 Not Found,例如http://example.com/articles ,直接在您的浏览器中,您需要:

通过重定向到 index.html 页面。

您可以通过以下方式之一执行此操作:

    添加一个自定义 404 页面,将您重定向到 index.html。 如果您的托管解决方案 c-panel 为部署提供了错误页面设置,请提供 index.html 作为错误页面。 使用来自 react-router 的HashRouter。检查HashRouter Solution 和What's HashRouter。

另外,请检查notes-on-client-side-routing 和How to deploy on cPanel。

【讨论】:

这是在nginx 和apache2 服务器上的操作方法。【参考方案2】:

我想我有点晚了,但最好的解决方案是: 使用 HashRouter 代替 BrowserRouter 并使用此源代码将 404.html 添加到公共文件夹:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta
    name="viewport"
    content="width=device-width, initial-scale=1, user-scalable=0, maximum-scale=1, minimum-scale=1"/>
    <title>Your Page Title</title>
  </head>
  <body>
    <noscript>You need to enable javascript to run this app.</noscript>
    <div id="root"></div>
    <script>
    var path = window.location.pathname;
    path = path[0] + "#" + path;
    var url = window.location.protocol + "//" + window.location.hostname + path;
    //document.write("Redirecting To: "+url);
    window.location.href=url;
    </script>
  </body>
</html>

所以现在,如果您访问http://example.com/articles,它几乎会立即自动重定向到http://example.com/#/articles,您甚至都不会注意到并正确渲染而不会出现任何 404 错误!!!。

注意:如果您使用的是 github,则此答案适用,如果您使用的是 cpanel,请使用带有上述源代码的自定义 404 页面。

【讨论】:

以上是关于尝试输入反应应用程序路由时出现 404的主要内容,如果未能解决你的问题,请参考以下文章

在 EmberJS 分发应用程序中直接访问路由时出现错误 404

春季注销时出现错误 404

重新加载/刷新操作时出现 Nextjs 404 错误

Nuxt 应用程序在部署到现在时在刷新时出现 404 错误

使用 vue3 路由重新加载页面时出现错误 404

尝试从我的自定义 iOS 应用与 Google+ 共享时出现 404 错误