我最近将HashRouter转换为BrowserRouter,因为它在开发环境中运行良好,因为我添加了

  devServer: {
    historyApiFallback: true,
    allowedHosts: 'all',
  },

至WebPack.dev.config

当我在Prod上运行这个应用程序时,myapp.com可以工作,但myapp.com/home不能工作(它显示nginx 404错误).

如果我转到myapp.com/#/home,那么它会将我重定向到myapp.com/home,页面将呈现(我已经捕获了将遗留散列转换为普通URL的所有逻辑).

这是我完整的webpack配置.

Webpack.common.js

module.exports = {
  entry: path.join(__dirname, 'src', 'index.js'),
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
    chunkFilename: '[id].js',
    publicPath: '/',
    hashFunction: 'xxhash64',
  },
  resolve: {
    extensions: ['.js', '.jsx'],
  },
  module: {
    rules: [
      {
        test: /\.(scss)$/,
        use: [
          {
            // inject CSS to page
            loader: 'style-loader',
          },
          {
            // translates CSS into CommonJS modules
            loader: 'css-loader',
          },
          {
            // Run postcss actions
            loader: 'postcss-loader',
            options: {
              // `postcssOptions` is needed for postcss 8.x;
              // if you use postcss 7.x skip the key
              postcssOptions: {
                // postcss plugins, can be exported to postcss.config.js
                plugins: function () {
                  return [require('autoprefixer')]
                },
              },
            },
          },
          {
            // compiles Sass to CSS
            loader: 'sass-loader',
          },
        ],
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env', '@babel/preset-react'],
          },
        },
      },
      {
        test: /\.css$/,
        exclude: /node_modules/,
        use: [
          { loader: 'style-loader' },
          {
            loader: 'css-loader',
            options: {
              modules: {
                localIdentName: '[name]__[local]___[hash:base64:5]',
              },
              sourceMap: true,
            },
          },
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [['autoprefixer', {}]],
              },
            },
          },
        ],
      },
      {
        test: /\.(png|jpe?g|gif|svg)$/,
        use: [
          {
            loader: 'url-loader',
            options: { limit: 10000, name: 'static/media/[name].[hash:8].[ext]' },
          },
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: __dirname + '/public/index.html',
      filename: 'index.html',
      inject: 'body',
      favicon: './public/favicon.ico',
      manifest: './public/manifest.json',
    }),
  ],
}

Webpack.prod.js

module.exports = merge(common, {
  mode: 'production',
  performance: {
    hints: false,
    maxEntrypointSize: 512000,
    maxAssetSize: 512000,
  },
  plugins: [
    new Dotenv({
      path: './.env',
    }),
  ],
})

我遗漏了什么?

编辑

myapp.com可以工作,但如果我想导航到myapp.com/intro,它会给我ngnix 404.

推荐答案

这是因为,您的路由是您的网站内部的,而服务器(Nginx)不会知道为这些内部路由提供什么文件.

您的服务器知道url"myapp.com"必须提供"index.html",但不知道在其他url(如"myapp.com/home")的情况下要提供什么文件,因此它返回"404.html",这是默认的nginx配置.

这些路由需要在您的部署配置中明确提及.比如,对于所有以"myapp.com"开头的url,您必须更新nginx配置才能提供"index.html".

因为服务器不会解析"#"之后的url,所以服务器myapp.com/#/homemyapp.com/#/是一样的,所以它在HashRouter中起作用.服务器发送index.html,然后您的HashRouter解析‘#’之后的url,并相应地发送内容

Reactjs相关问答推荐

全局上下文挂钩-替代不起作用

导致useState中断的中断模式

使用REACT-RUTER-DOM链接仅更新一个搜索参数

在Reaction中管理多个状态

如何解决Reaction中遗留的上下文API错误?

如何从Reaction-Arborist树获取排序数据

未定义发送的数据无法在reactjs中找到原因

React useEffect 问题...异步函数内的变量正在获取延迟的更新值

React中的功能性组件克隆优化

CORS策略:对预检请求的响应未通过访问控制判断:没有Access-Control-Allow-Origin

在 CrafterCMS Studio 中拖动字段

即使配置了 webpack.config.js,html-loader 也不起作用

如何使用样式化函数为 TextField 的输入组件设置样式

为什么刷新页面时我的localStorage PET值变成空字符串?

我应该使用 useEffect 来为 React Native Reanimated 的 prop 值变化设置动画吗?

使用 react-router-dom 时弹出空白页面

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

如何在props 更改时运行自定义挂钩?

如何使用 React Router 在 React 中正确同步 useEffect 和 useLocation 挂钩?

仅react material 表前端分页