缩短S3签名URL

9
我正在创建签名URL并将它们发送到外部系统以供以后使用。不幸的是,有一些长度参数不能传递极长的字符串。最近,签名URL已被重新格式化和扩展,这随后导致我的应用程序出现了问题。
是否有一种从S3生成较短URL的方法?我宁愿不依赖第三方URL缩短服务,因为这会增加URL生成的额外请求并增加故障点。

我想你可以创建类似于 bucket.s3.amazonaws.com/short/<random-string> 的东西,并将其作为一个 HTML 文件,该文件执行 JS 重定向到已签名的 URL。 - ceejayoz
1
是的,使用301重定向是正确的选择。设置起来并不需要太多的努力。@ceejayoz - tedder42
1
而且,你可以通过以主机名命名存储桶并将主机名指向存储桶的网站端点来缩短301目标。但是,为长时间存储签名URL存在一个根本性问题...在Sig V4中,它们最多在7天后过期。Sig V2没有这个限制,但是旋转密钥仍将使所有使用已弃用密钥创建的预签名URL无效。 - Michael - sqlbot
1
没有本地的、简单的、翻转开关的解决方案……只有变通和替代方案。你需要多短?你打算将它们存储多长时间以备后用? - Michael - sqlbot
看起来我的最佳选择是通过redis构建本地“短”URL映射器。我只需要让这些URL在最多24小时内有效(目前如此),所以这是一个合理的解决方案。唯一的缺点是,如果我的Web服务器崩溃,上传将失败 - 而以前,由于我是通过外部系统上传的,所以无论我的Web服务器状态如何,它都可以正常工作。 - switz
显示剩余2条评论
2个回答

11
您可以在Amazon S3中直接构建一个非常简单的URL缩短服务:
1. 打开静态网站托管。这将为您提供访问存储桶的URL,例如:mybucket.s3-website-ap-southeast-2.amazonaws.com 2. 在S3中创建一个零长度对象,并给它一个“短名称”,例如pic1.jpg 3. 为零长度对象添加元数据:
键:Website Redirect Location
值:长网址
然后,当您访问零长度对象(例如mybucket.s3-website-ap-southeast-2.amazonaws.com/pic.jpg)时,它实际上会重定向到元数据中存储的长网址。
没有数据库,非常简单!

这太棒了。只是分享我的用例,我正在使用curl将文件上传到S3,并且必须在上传之前提取重定向。 curl -Ls -o /dev/null -w %{url_effective} SHORT_URL | xargs curl -T file.png其中SHORT_URL是缩短的AWS网址。 - switz
4
这绝非简短的网址...(mybucket.s3-website-ap-southeast-2.amazonaws.com/pic.jpg) - eiTan LaVi
2
@eiTanLaVi 是的,但是你可以将aws s3路由添加到转发子域名中,以缩短长的mybucket.s3-website-ap-southeast-2.amazonaws.com部分。这就是我最终采取的做法。我按照这个模式操作,它正在运作。虽然有些要点看起来比较简单,但实际上还需要更进一步的了解。 - Gandalf458
在这种情况下,难道他的桶不必须是公共的吗? - Kaushal Pahwani

0
预签名URL的目的是为了提供一个临时访问S3中私有文件的链接。 警告:重定向或缩短这些URL存在安全风险。最终的URL需要难以猜测或推断,因此它应该是长的且真正随机的
如果您的S3文件是公开的,您可以将其标记为公开,并直接链接到它们。或者您可以将Cloudfront分发链接到存储桶,并为该分发分配自定义域名。或者您可以使用重定向/缩短服务。
如果您的S3文件是私有的,您可以例如发送链接到一个需要身份验证的页面,并在该页面上放置实际的文件下载按钮,该按钮具有预签名的URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接