【问题标题】:react-router-dom Build Giving 404 When Accessing URL Directly, But Not In Developmentreact-router-dom 在直接访问 URL 时构建给出 404,但不在开发中
【发布时间】:2019-03-15 22:21:45
【问题描述】:

我有一个使用 create-react-app 创建的 react 应用,并且正在使用 react-router-dom 进行路由。

总体布局是:

App.js

<BrowserRouter>
    <BodyContent />
</BrowserRouter>

正文内容.js

        <Fragment>
            <Navigation/>
            <main>
                <ScrollToTopRoute path="/" exact component={HomePage}/>
                <ScrollToTopRoute path="/page1" exact component={Page1}/>
                    <ScrollToTopRoute path="/page1/page2" exact component={Page2}/>
                <ScrollToTopRoute path="/page3" exact component={Page3}/>
               ... etc...


            </main>
        </Fragment>

ScrollToTopRoute 只是标准路由器功能的扩展,可确保新页面滚动回顶部以获得良好的用户体验。

ScrollToTop.js

import React, { Component } from 'react';
import { Route, withRouter } from 'react-router-dom';
import ReactGA from 'react-ga';
ReactGA.initialize('UA-5477132-2');



class ScrollToTopRoute extends Component {
    componentDidUpdate(prevProps) {
        if (this.props.path === this.props.location.pathname && this.props.location.pathname !== prevProps.location.pathname) {
            window.scrollTo(0, 0);
            ReactGA.pageview(window.location.pathname + window.location.search);
            console.log("Triggered");
        }
    }

    render() {
        const { component: Component, ...rest } = this.props;

        return <Route {...rest} render={props => (<Component {...props} />)} />;
    }
}

export default withRouter(ScrollToTopRoute);

在开发过程中,应用程序按预期工作,所有路由都正常工作,如果您直接访问localhost:3000/page1 之类的 URL,它将正确加载。我已经使用 yarn build 构建了站点并部署到了典型的 VPS。网站和组件/路由的内部链接都按预期工作,但是当直接访问上面的 URL(例如 www.theurl.com/page1)时,它将 404,我不知道为什么结果不同。

【问题讨论】:

    标签: reactjs react-router react-router-dom


    【解决方案1】:

    我也面临同样的问题。通过添加具有以下内容的 htaccess 文件来修复它:

    <IfModule mod_rewrite.c>
    
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.html$ - [L]
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-l
      RewriteRule . /index.html [L]
    
    </IfModule>
    

    How to fix "404" error when directly accessing a component in react找到解决方案

    【讨论】:

      【解决方案2】:

      我相信造成这种情况的根本原因实际上是由于您的服务器的配置方式。

      React Router 只能在您的前端脚本(从索引页面)加载后处理路由,这当用户在生产中点击/foo deeplink 路由时,情况并非如此。

      您必须将您的服务器设置为在每个路由请求除了对于需要由服务器处理的api路由返回索引页面。

      这应该将您的服务器设置为让 React Router 处理深度链接请求。

      如果您使用的是 Node 和 Express,它应该看起来像这样:

      app.get('*', function (req, res) {
        res.send('public/index.html')
      })
      

      如果我可以进一步解释,请告诉我。

      【讨论】:

      • 嗨,迈克,感谢您的领导。我实际上对 Node 和 React 很陌生,这个项目是我的第一次生产尝试,所以我对这一切还是很陌生(但是对典型的 LAMP 堆栈很有经验)。该应用程序是一个典型的 create-react-app 结构,我没有使用 Express。服务器安装了节点,所以我不确定我会在哪里添加你建议的行。
      • 当然!你有能力使用 Express 和 Node 还是有理由不这样做? Express 是一个非常简单且精益的框架,用于在 Node 运行时中设置 Web 服务器。它确实是我喜欢使用的唯一框架,因为它简单可靠。如果可以,我很乐意帮助您进行设置!
      • 我有能力使用 Express。我在一个运行后端 API 以与 mysql 对话并将内容返回到前端反应应用程序的开发项目中玩了一点,但是我对它并没有超级经验。理论是在 react 应用中安装 express 还是运行单独的后端 API 来处理路由?
      • 所以理论上是在后端API上安装express,并在express中处理后端API路由。 React Router 应该处理前端路由,而像 Axios 这样的服务处理对后端路由的请求。基本上任何时候查看您的站点的请求都会发送到您的服务器,使用 index.html 文件进行响应 - 这将运行脚本文件并在前端设置 React-Router。发生的问题是当用户尝试点击 www.example.com/deeplink 时,您的服务器没有发送索引文件,因此没有设置 React 路由。
      • 您的服务器上没有设置路由来处理/deeplink 路由,因此正在生成 404 错误。如果你告诉所有你希望 React Router 处理的路由请求返回 index.html 文件(你的脚本文件正在运行 - 设置反应路由器),那么 React Router 应该处理深层链接,同时仍然允许你请求来自后端 API 的数据。
      猜你喜欢
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2022-06-14
      • 2018-04-21
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多