【问题标题】:How to fix 404 when reloading page in reactjs在reactjs中重新加载页面时如何修复404
【发布时间】:2019-12-27 19:39:31
【问题描述】:

我在生产中遇到 reactjs 问题,在我的开发机器中,我可以轻松地刷新/重新加载而无需重定向到 404(未找到页面),但在生产期间,每次我在 http://example.com/subdirectory/dashboard 中重新加载或刷新时,它总是会转到http://example.com 的 404 页面,但是当我在开发机器 http://localhost:3000/subdirectory/dashboard 中刷新/重新加载页面时,它将按预期重新加载。

注意:在生产中,我将静态数据上传到子目录中,因此我在路由中使用 basename。

【问题讨论】:

  • 我认为在生产中你需要启用重写规则。

标签: reactjs


【解决方案1】:

如果您在标准网络服务器上为您的应用程序提供服务,您可以使用以下代码添加.htaccess,从而启用重写规则:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]

您所面临的 404 问题很可能只需将上述内容与项目的根目录一起提供即可解决。

或者,您也可以使用以下将其用作节点服务器:

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

app.use(express.static(path.join(__dirname, 'build')));

app.get('/', function(req, res) {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

app.listen(9000);

以上可以与.htaccess结合使用。

创建 react 应用程序的人还推广服务,您可以找到 here 和官方的 react 部署文档 here

1:https://github.com/zeit/serve

2:https://create-react-app.dev/docs/deployment#docsNav

【讨论】:

  • 非常感谢你拯救了我的一天.htaccess拯救我的一天。
【解决方案2】:

在您的 http 服务器中,您必须将所有 url 重写为 index.html 文件。如果您使用的是nginx,您可以按照以下说明操作:React-router and nginx

【讨论】:

    【解决方案3】:

    您可能需要为生产环境中的 React.js 应用程序创建代理服务器。您可以通过不同的方式执行此操作,但要使用 Express Node.js 执行此操作,您必须创建一个如下所示的文件:

    const express = require('express');
    const path = require('path');
    
    const port = 7700;
    
    const app = express();
    
    
    app.use(express.static(path.join(__dirname, '../public')));
    
    app.all('*', (req, res) => {
      res.sendFile(path.join(__dirname, '../public/index.html'));
    });
    
    app.listen(port, () => {
      console.log(`Listening on ${port}`);
    });
    

    上面的 sn-p 假设您已经构建了 React 文件并且您的 index.html 位于 public 目录中。这会使用 * 通配符将来自 express 服务器的所有请求代理到您的 React 路由。

    完成后,剩下的就是在您的服务器上运行这个快速应用程序,它会像处理常规服务器路由一样处理您的历史 API 路由。

    【讨论】:

      【解决方案4】:

      像这样在你的 src/index.js 中添加 basename (您也可以在 index.html 文件的 head 标签中添加<base href="/subdirectory" target="_blank">

                  <Router
                      basename={'/subdirectory'}
                  >
                      <App />
                  </Router>
      

      【讨论】:

        【解决方案5】:

        在您的 public 文件夹中创建一个文件 _redirects 并写入 /* /index.html 200 在里面

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2018-10-05
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 2020-07-18
        • 2019-08-18
        • 2019-05-17
        • 1970-01-01
        相关资源
        最近更新 更多