首页 > 解决方案 > 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 与重定向)设置不同的行为规则吗?

标签: redirectamazon-s3aws-lambdaamazon-cloudfrontaws-lambda-edge

解决方案


不要使用WebsiteRedirectLocation特定于 S3 静态网站托管并且在 Cloudfront 是服务器时无效的元数据,而是使用包含meta具有所需重定向目标的 HTML 标记的 HTML 对象替换您的空对象:

<meta http-equiv="Refresh" content="0; url=https://www.example.com" />

分号前的数字是重定向前的延迟,以秒为单位,其中 0 是立即数。

不要忘记还将Content-Type对象的元标记更改为text/html.

如果您想支持可能无法正确处理 Refresh 指令的旧浏览器,请按照此处的说明添加锚链接。


推荐阅读