使用 Nginx 在刷新 404 上部署后创建 React 应用程序中断

App*_*Pie 0 javascript nginx reactjs create-react-app ibm-cloud

我正在使用 create-react-app,它在我的本地运行良好,没有任何问题。当我将其部署在 IBM Cloud 上时,登录后,当我刷新页面时,它会给出404 未找到错误之前工作正常,不确定发生了什么。

我看到了很多相关的问题,我试图解决但没有成功的事情如下

1. 创建一个static.json

{
  "root": "build/",
  "routes": {
    "/**": "index.html"
  }
}
Run Code Online (Sandbox Code Playgroud)

2.我有这个设置

devServer: {
    historyApiFallback: true,
    contentBase: './',
    hot: true
  },
Run Code Online (Sandbox Code Playgroud)

3.我尝试添加路由器,但没有成功

import React, { Component } from 'react';
import styled from 'styled-components';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

    class App extends Component {
      render() {
        return (
          <>
            <Router>
              <Switch>
                <Route exact path="/" component={SignUp} />
                <Route path="/some" component={Some} />
              </Switch>
            </Router>
            </>
        );
      }
    }

    export default App;
Run Code Online (Sandbox Code Playgroud)

4.我尝试添加以下内容

import { HashRouter } from 'react-router-dom'

<HashRouter>
  <App/>
</HashRouter>
Run Code Online (Sandbox Code Playgroud)

这些似乎都不适合我。有什么建议

小智 5

当将build/输出作为静态站点提供服务时,您必须将 nginx 配置为始终提供服务index.html(否则,它将尝试将 url 路径匹配到不存在的静态文件夹/文件)。有关此行为的更多信息可以在文档中找到create-react-app

如果您使用 nginx docker 映像来为您的站点提供服务,则需要设置以下内容default.conf

server {
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location ~ ^/$ {
        rewrite  ^.*$  /index.html  last;
    }
    listen       80;
    server_name  localhost;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意rewrite ^.*$ /index.html修改任何来电和服务的部分index.html

您的最小值Dockerfile将如下所示:

FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
COPY build/ /usr/share/nginx/html/
Run Code Online (Sandbox Code Playgroud)