gpt4 book ai didi

ruby-on-rails - 如何防止 Rails 3.1 将静态 Assets 缓存到 Rails.cache?

转载 作者:行者123 更新时间:2023-12-03 12:51:42 25 4
gpt4 key购买 nike

我在 Rails 3.1 应用程序上使用 CloudFlare CDN。 Cloudflare 是一个在 DNS 级别工作的 CDN。在第一次点击静态 Assets 时,CloudFlare 从您的应用程序加载它,然后将其缓存在他们的 CDN 中。从 CDN 而不是您的应用程序加载该 Assets 的 future 请求。

我遇到的问题是,如果您将 Controller 缓存设置为 true:

config.action_controller.perform_caching = true

它启用 Rack::Cache 中间件。由于 Rails 为静态 Assets 设置了默认缓存控制设置,因此这些 Assets 被写入 Rails.cache 存储。结果,我的缓存存储(在我的情况下为 redis)被静态 Assets 填充,其中 url 作为哈希键。

不幸的是,我无法在不影响 Cloudflare 和我的用户浏览器缓存 Assets 的情况下关闭静态 Assets 缓存控制 header 。我无法关闭 Controller 缓存或丢失页面/ Action /片段缓存。如果我删除 Rack::Cache 中间件,结果相同。

有没有人有任何其他想法?

更新:我在 GitHub here 上开了一张票.

最佳答案

经过大量的实验,我最终在我的 config/application.rb 中做到了这一点:

if !Rails.env.development? && !Rails.env.test?
config.middleware.insert_before Rack::Cache, Rack::Static, urls: [config.assets.prefix], root: 'public'
end

这样做是在对 Rack::Cache 的请求之前添加一个 Rack::Static 机架中间件。 Rack::Static 中间件将带有匹配前缀的 url 提供给根目录。在这里,我将 config.assets.prefix 作为我的 url 前缀,默认为“/assets”。我将根设置为“公共(public)”目录。

此路径的请求:

/assets/jquery-e8da439bbc8fd345e34ac57c6a216318.min.js

应该在这个文件中找到它:

公共(public)/ Assets /jquery-e8da439bbc8fd345e34ac57c6a216318.min.js

这应该直接从 public/assets 目录中提供任何 Assets ,而不是完全访问 Rails::Cache,这将阻止它将 Assets 存储在 Rails cache_store 中。这仅在您在生产中运行“rake assets:precompile”时才有效,否则“public/assets”中将没有预编译的 Assets 。

关于ruby-on-rails - 如何防止 Rails 3.1 将静态 Assets 缓存到 Rails.cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6962896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com