开发者问题收集

AWS Amplify 和 React 使用 react-router-dom 给出 AccessDenied

2022-07-17
1331

我使用 AWS Amplify 部署 React 应用程序。当我部署 React Web 应用程序时,根 URL 可按预期工作(example.com)。但是,如果您尝试访问子 URL(例如 example.com/something),则会出现错误 AccessDenied。

我的 react-router 代码如下:

import { BrowserRouter, Routes, Route } from "react-router-dom";

const Router = () => {
    return ( 
        <React.Fragment>
            <BrowserRouter>
                <Routes>
                    <Route path="/" element={
                        <React.Fragment>
                            <Footer/>
                        </React.Fragment>
                    } />

                    <Route path="something" element={
                        <React.Fragment>
                            <Something/>
                            <Footer/>
                        </React.Fragment>
                    } />
                </Routes>
            </BrowserRouter>
        </React.Fragment>
    )
}

环顾四周, 似乎您需要设置一个重定向规则 ,如下所示:

[
    {
        "source": "</^[^.]+$|\\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json)$)([^.]+$)/>",
        "target": "/index.html",
        "status": "200",
        "condition": null
    }
]

当我这样做时,它确实不再给我 AccessDenied 错误,但是现在我的 react-rotuer-dom 代码无法按预期工作,我只得到一个空的 index.html 页面。

我已经有这种情况很长时间了,这太烦人了。我不知道这是 React 问题还是 AWS 问题。您能给我指出正确的方向吗?

更新

AWS Amplify Exports 似乎存在问题?当我尝试导航到 Web 应用程序的主页时,我得到了一个空白页,然后查看控制台时,我看到一个错误: “TypeError:undefined 不是对象(评估‘l[e].call’)” ,即以下行:

return l[e].call(r.exports, r, r.exports, f), r.l = !0, r.exports
3个回答

看来您需要将 <Route path="something" 更改为 <Route path="/something" 。这可能是您被重定向回 index.html 而不是您想要的实际路线的原因。

bentz123
2022-07-21

首先,我建议在路由中使用 Switch 来捕获页面未找到错误 404

import { BrowserRouter,Switch, Routes, Route } from "react-router-dom";

const Router = () => {
    return ( 
        <React.Fragment>
            <BrowserRouter>
              <Switch>
                <Routes>
                    <Route path="/" element={<Footer/>} />

                    <Route path="something" element={
                        <>
                            <Something/>
                            <Footer/>
                        </>
                    } />
                </Routes>
              </Switch>
            </BrowserRouter>
        </React.Fragment>
    )
}

第二次更新源属性为

[
{
    "source": "**",
    "target": "/index.html",
    "status": "200",
    "condition": null
}
]
Salem_Raouf
2022-07-25

我总是在 netlify 中使用它,但我不知道它是否适用于 amplify。

在包 json 中更改它

如果使用 vite "build": "vite build && echo '/* /index.html 200' | cat >dist/_redirects"

如果使用 CRA "build": "react-scripts build && echo '/* /index.html 200' | cat >build/_redirects"

azmi
2022-07-26