我有一个使用反应路由器的应用。我已经设置了我的开发环境来使用它,当我想要刷新页面时,我没有问题,或者服务器自己做,但是当我进行生产构建时。如果任何用户使用应用程序中的刷新按钮,则会出现404错误。
我知道在服务器中(我的prod构建将在ISS srv中),应用程序试图访问的路由器所做的路由不存在,那么我该如何解决这个问题呢? /> 我需要做什么以及如何做? 我对此非常陌生。
感谢您的时间和帮助!
答案 0 :(得分:1)
我将尝试解释路由器如何管理您的应用程序状态。
说你有跟随路由器
<Router>
<Route to="/" component={Home}>
<Route to ="/about" component={About} />
</Route>
<Router>
假设您在应用程序的主页上,/
。现在说yoy使用主页上的/about
导航到Link
网址。这将由您的react路由器提供。事情很好。
现在说,当你在/about
路线时,你刷新页面。现在,Web浏览器就像任何页面请求(无论是否是单页应用程序)都会向您的后端服务器发送请求以获取页面。因此,您需要在后端为第一页加载配置路由。
现在你必须使用webpack编译你的反应组件并获得一个捆绑输出吗?你把你的html文件放入?现在所有路由都只提供此html文件。
当你有编译的JS文件时,react-router
上的页面渲染会自动呈现页面。
现在配置路由有多种方法可以做到。其中一个是在后端添加所有路由,它们使用包含您的反应代码的已编译的javascript呈现相同的html文件。另一个可以使用nginx
之类的东西,只返回那里的html。
答案 1 :(得分:-1)
对于您的生产设置,您需要设置ISS服务器,以便所有传入的URL请求都将返回index.html文件。我不确定在ISS中如何做到这一点,但在像Apache这样的东西中,你会使用URL重写。
您希望始终返回index.html的原因是因为index.html本质上是您的反应应用程序,react-router组件将处理路由并根据URL呈现所需内容。
您不会重写指向静态资源的URL(css / js / pngs / etc。文件)。为方便起见,您可能希望在您网站的/static/
网址下提供所有静态文件。
因此,您希望配置服务器以使(*
成为通配符):
/static/*
返回URL中请求的任何静态资源
/*
会返回您的index.html页面
在开发环境中运行时不必担心这个问题的原因是因为webpack-dev-server配置为为您完成所有操作。