amazon-web-services - S3 上的刷新页面会引发“访问被拒绝”错误,但如果我使用原点则不会
问题描述
我有一个托管在 AWS 上的 NextJS 应用程序。我已将我的域配置为指向 Cloufront 并指向 S3 源存储桶。我已将此策略添加到我的 S3 存储桶中:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::<mybucket>/*"
}
]
}
我已将其公开并启用了静态网站托管。我还在 Cloudfront 中将默认对象设置为 index.html。
所以发生的事情是,当我进入我的域时,主页会加载,只要我点击链接,我就可以到达该页面。但是只要我点击刷新,我就会收到 S3AccessDenied
消息。我的文件夹结构是这样的:
- /index.html
- /articles
-- index.html
-- /article1
---- /index.html
-- /article2
---- /index.html
.
.
.
基本上每条路径都有自己的 index.html(与 NextJS 共同设置)。我读到了一个 404 问题,还设置了一个 404 错误页面,正如这个关于 404的问题中提到的那样。然而它并没有解决问题。
然后我尝试通过 S3 原始 URL 直接访问我的网站,一切都按预期工作,包括页面刷新。所以,我在想我的域和 S3 源之间的映射不起作用,但我不确定它是什么。是在 Cloudfront 还是 S3 策略上还是其他什么东西上。
请指教。
解决方案
有一个使用 Cloudfront 函数的解决方法。
例如,你有一个 Next.js 博客./pages/blog/[slug].tsx
,你想直接通过它访问它,https://example.com/blog
这样它也可以在刷新时工作。
您必须将请求从 /blog 重定向到 /blog.html
将此作为查看器请求函数添加到分发的默认行为中。
function handler(event) {
var request = event.request;
var uri = request.uri;
if (uri !== '' && uri !== '/' && uri.indexOf('.') === -1) {
request.uri = uri + '.html';
}
return request;
}
推荐阅读
- templates - 每次制作新文档时,如何制作 Notepad++ 使用的模板?
- javascript - 有没有办法只在 Angular 的对象中显示 iframe 元素?
- c++ - cmake分别链接共享和静态库
- android - 如何为拥有多个设备的用户管理 APN 令牌?
- swiftui - 错误消息:“函数声明了一个不透明的返回类型,但在其主体中没有返回语句来推断基础类型”
- sql - 嵌套选择的 SQL SELECT 语句
- rust - Rust - 缓存某些不可变数据视图的惯用方式
- c++ - Add a set of numbers in C++
- c# - 如何将蒙特卡罗模拟拟合到二维矩形阵列中
- python - 使用 Python 3 在 Windows 中查找插入符号位置