amazon-cloudfront - 修复使用 Lambda@Edge 处理漂亮 URL 时的 Cloudfront 403 Access Denied 请求错误
问题描述
我有一个简单的 HTML 文件,它加载了一个位于它旁边的 json 文件。
我在这里遵循了一些 AWS 文档实施默认目录索引,因为我的网站结构如下:
/apple/index.html /orange/index.html
我需要我的用户能够简单地访问 mydomain.com/apple 而无需添加 /index.html。
AWS 帖子中的 Lambda@Edge(已修改)函数运行良好,除了一个关键问题:每个 index.html 文件旁边都有一个 json 文件,并发出同源请求以加载 json 数据。
如果直接访问 /apple/index.html 这很好,但是如果您访问 /apple 的 HTML 文件无法加载 json 文件,它会得到 403 访问被拒绝,因为 Lambda@Edge 正在修改请求并基本上附加了 uri对自己。
如何在 Lambda 函数中更正此问题?
这是我实际使用的功能:
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const uri = request.uri;
if (uri.endsWith('/')) {
request.uri += 'index.html';
} else if (!uri.includes('.')) {
request.uri += '/index.html';
}
callback(null, request);
};
解决方案
现在我已经确定了根本原因,我了解到这个问题在 Cloudfront 中很常见。
这个答案帮助我解决了这个问题。
推荐阅读
- matlab - 在 MATLAB 中绘制多变量函数
- python - 如何在每次 X 迭代后跟踪 python 多处理池并运行一个函数?
- reactjs - 在 react-select 中自定义“未找到数据”验证消息
- ionic-framework - 离子视图不使用双向数据绑定进行更新
- oracle - Listagg 函数让我重复数据
- firebase - Firebase Cloud Firestore 将文档引用存储为字符串而不是对象引用
- django - django rest 框架 - POST 请求导致 400 状态码
- reactjs - 在 React 的 setState 函数中改变深层领域的最佳方法是什么?
- sql - 我如何知道查询中是否使用了任何索引 | PostgreSQL 11?
- api - 使用win内核基础编程的GetLocalTime函数