redirect - Cloudfront、lambda@edge、S3 重定向对象、
问题描述
我正在构建一个 S3 URL 重定向,没什么特别的,只是一堆零长度的对象,其中填写了 WebsiteRedirectLocation 元数据。S3 存储桶设置为服务器静态网站,存储桶策略设置为公共等。它工作得很好。
但是 - 我还想锁定存储桶中的某些文件 - 特别是一些用于管理重定向的 HTML 文件(例如添加新的重定向)。使用传统设置,我既可以使用重定向,也可以很好地提供 HTML 页面。但为了锁定它,我需要像在这些帖子中一样使用 Cloudfront 和 Lambda@edge:
https://douglasduhaime.com/posts/s3-lambda-auth.html
http://kynatro.com/blog/2018/01/03/a-step-by-step-guide-to-creating-a-password-protected-s3-bucket/
我已将 lambda@edge 脚本修改为仅在请求管理页面(或其资产,如 CSS/JS)时提示输入密码。如果请求的路径是其他路径(可能是重定向文件),则不会提示用户输入密码。是的,我还可以在 Cloudfront 中设置行为规则来决定何时使用 Lambda 函数来提示输入密码。
它的工作原理。当我按照这些说明通过 Cloudfront URL 访问我的站点时,当我转到站点的根目录(管理页面)时,确实会提示输入密码。但是,重定向将不起作用。如果我尝试加载重定向,浏览器只会下载它。
现在,在另一篇文章中,有人建议我将我的 Cloudfront 分发端点更改为 S3 存储桶 WEBSITE 端点 - 我认为这也意味着将存储桶策略更改回网站模式和公众,这很糟糕,因为现在它可以在我的 Cloudfront 策略之外访问不要。此外 - Cloudfront 不再自动提供指定的索引文件,这不是最糟糕的事情。
所以 - 是否可以锁定我的存储桶,服务器完全通过 Cloudfront 与 Lambda@edge 但也有 Cloudfront 尊重这些重定向,而不是仅仅提示下载?Cloudfront 中是否有尊重标头的设置?我应该为不同的文件(HTML 与重定向)设置不同的行为规则吗?
解决方案
不要使用WebsiteRedirectLocation
特定于 S3 静态网站托管并且在 Cloudfront 是服务器时无效的元数据,而是使用包含meta
具有所需重定向目标的 HTML 标记的 HTML 对象替换您的空对象:
<meta http-equiv="Refresh" content="0; url=https://www.example.com" />
分号前的数字是重定向前的延迟,以秒为单位,其中 0 是立即数。
不要忘记还将Content-Type
对象的元标记更改为text/html
.
如果您想支持可能无法正确处理 Refresh 指令的旧浏览器,请按照此处的说明添加锚链接。
推荐阅读
- swift - macOS Swift 启动位置无法访问
- r - 如何在ggplot的玫瑰图中将y轴从计数更改为百分比?
- python - Pandas 过滤在另一列中同时具有空值和非空值的值
- unity3d - UnityWebRequest 未完成
- unity3d - 在 Unity 中从一个值开始旋转刚体,并与控制器增量角度成比例
- symfony - findAll 没有为 ManyToMany 提供任何输出
- azure-pipelines - Azure 管道 rnuget 从另一个管道还原结果
- windows - 我正在学习批处理 - 为什么我在设置环境变量时遇到问题,并将其他环境变量作为输入?中弦问题
- typescript - Typescript recursion of promises
- sql - Pl sql invocation using pre sql in IICS