Cha*_*hna 16 amazon-s3 amazon-cloudfront reactjs react-router aws-application-load-balancer
当我将 React Router 应用程序部署到 AWS S3 和 CloudFront 时,并且当我尝试直接访问 React 路由时,它会出现以下错误,并显示 403 错误代码。当它流经应用程序时,我可以访问基本 URL ( www.sample-app.com ) 和路由 URL ( www.sample-app.com/cart )。
但是如果我尝试直接进入 React 路由(www.sample-app.com/cart),它会产生 403 Access Denied 错误,如下所示。主要的痛点是当我尝试刷新 React 路由 URL 时它会产生此错误。
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>REQUEST_ID</RequestId>
<HostId>HOST_ID</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)
注意:我使用 AWS 负载均衡器和 Lambda 函数作为后端。我已设置 AWS ALB 和 Cloudfront 以使用 AWS Cognito 对用户进行身份验证。
感谢您对此的帮助。
小智 10
由于cloudfront只能访问存储桶中确实存在的文件,并且如果请求不存在的对象,它将返回403,因此您需要添加一个自定义错误页面,该页面返回带有200状态代码的index.html文件。然后,因为返回了index.html,React Router 就可以完成它的工作了。
更多信息请点击这里:
使用 CloudFormation 创建 Cloudfront Distribution 时,请在 DistributionConfig 部分中使用以下内容
"DistributionConfig": {
//Other configs
"CustomErrorResponses":[
{
"ErrorCachingMinTTL" : 1,
"ErrorCode" : 403,
"ResponseCode" : 200,
"ResponsePagePath" : "/index.html"
}
]
}
Run Code Online (Sandbox Code Playgroud)
San*_*eph -1
<BrowserHistory>
就像我在评论中提到的,当您托管在静态站点中时无法使用。您需要一种机制将所有 URL 重定向到您的 index.html,以便 React-router 接管。
为了实现这一点,您将需要一些服务器端代码和托管。S3 无法工作,因为它只能处理静态文件。如果 S3 是唯一的选择,请使用或[此处][1]提到的 hack。我不会推荐它,但有一个。
如果您计划使用服务器端代码,这里是如何使用 NodeJs Express 来获取路由工作的示例,
app.use(express.static(path.join(__dirname, 'dist')));
app.get('*', function(req, res) {
res.sendfile('./dist/index.html');
});
Run Code Online (Sandbox Code Playgroud)
假设您的构建位于 dist 文件夹中。[1]:React 路由器在 aws s3 存储桶中不起作用
归档时间: |
|
查看次数: |
12932 次 |
最近记录: |