如果你使用 ActiveStorage 并且你有一个包含 N 个图像的页面,你会收到 N 个额外的 Rails 应用请求(即 N 个重定向)。如果您在一个页面上有数十个图像,这意味着浪费大量的服务器资源。
我知道重定向对签名 URL 很有用。但是我想知道为什么 Rails 不预先计算最终的签名 URL 并将其嵌入到 HTML 页面中……这样我们可以保持签名 URL/ protected 文件的优势,而无需对 Rails 服务器进行 N 次额外调用。
是否可以直接在 HTML 中包含图像变体的最终 URL/预签名 URL(从而避免重定向)?否则,为什么不可能呢?
最佳答案
经过几天的推理和测试,我对我的最终解决方案感到非常兴奋,我将在下面解释。这是一种固执己见的图像处理方法,可能并不代表当前的 Rails Way™️,但是对于提供许多公共(public)图像的网站来说,它具有难以置信的优势,特别是:
这是解决方案:
storage.example.com
) - 您甚至可以禁用存储桶级别的公共(public)访问,并使用存储桶策略仅允许访问 Cloudflare ips storage.example.com
配置 CNAME指向您的域;您需要使用灵活 SSL(您可以为子域使用页面规则);使用页面规则设置重缓存:设置 Cache Everything 并为 Browser Cache TTL 和 Edge Cache TTL @post.variant(...).processed
每次更新或创建 @post
后;然后在您的意见中使用 'https://storage.example.com/' + @post.variant(...).key'
(请注意,我们不会在 View 中调用 processed
以避免在 s3 中进行额外检查);你也可以有一个调用 processed
的 rake 任务。在每个对象上,以防您需要重新生成变体;如果您只有几个不经常更改的变体(例如每个帖子 1 个图像/变体),这将非常有效上述大部分步骤都是可选的,因此您可以根据需要将它们组合起来。
关于ruby-on-rails - Rails ActiveStorage : how to avoid one redirect for each image?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59013049/