我制作了一个React应用程序,该应用程序与this tutorial指导下的API服务器托管在同一台计算机上。
我的目录以
的方式设置- root
- server.js (entry for the API server)
- app (for all back-end stuff)
- client (directory for React app)
- public (static files used in the front-end)
- src (for all front-end stuff)
- build (directory containing static build)
- index.html (entry for front-end)
- ... (other bundled stuff)
我正在以下方法提供我的React应用程序的静态副本。
// server.js
const app = express();
if (process.env.NODE_ENV === 'production') {
app.use(express.static('client/build'));
}
app.use('/api', routes); // for API routes
我遇到了一个问题,当我在本地启动它时(使用NODE_ENV=production
)一切顺利,页面刷新不会破坏应用程序。
但是,在将此部署到Elastic Beanstalk之后,页面刷新会破坏应用程序,并在浏览器中显示此html错误消息。
Cannot GET /{whichever url path I had prior to refresh}
我可以在日志中看到浏览器尝试使用 GET / {url_pathname}
向服务器发送请求我最初怀疑同时使用React路由器和Express路由器会变得有趣,但是我又很困惑,为什么这与localhost中的情况不一致。
答案 0 :(得分:1)
如果您运行的是基本上在单个索引文件上运行的react应用程序,那么您的中间件路由器应该具有一个始终指向某个索引文件的catch-all路由。
app.get('/*',(req, res) => {
res.sendFile(path.join(__dirname + '/client/build/index.html'))
})
请注意,当前示例取决于path
模块......所以:
import path from 'path'
// or
const path = require('path')
答案 1 :(得分:0)
如果您使用的是NGINX,则需要更新位于的配置文件 的的/ etc / nginx的/位点可用的强>
location / {
try_files $uri $uri/ /index.html$is_args$args;
}
或者,如果您的应用不在默认目录中,例如" app-location"你会得到这个。
location /app-location {
root /var/www;
index index.html;
try_files $uri $uri/ /app-location/index.html;
}
然后重新启动nginx
sudo service nginx restart