我的Rails应用程序的公共文件夹中有一些文件不属于资产管道(例如sitemap.xml或可嵌入小部件的.js文件)。
虽然我在更新public / assets文件夹中的资产时没有问题,但是我更新这些静态文件时遇到了麻烦。奇怪的是,我可以添加新文件,但我无法更新现有文件。当我在开发中更新它们时,在生产环境(Heroku)中不会考虑修改。
我尝试了很多东西,但似乎无法找到解决方案。有什么想法吗?
答案 0 :(得分:1)
对于那些可能带着同样问题到达这里的人,我最终得到了Heroku支持团队的解决方案。我选择了清除缓存的最后一个选项(Rails.cache.clear),因为我在Memcachier中没什么重要的。
以下完整回复:
您好,
我是来自Ruby Task Force的Terence。我已经调查过你的问题了 我相信正在发生的事情是正常的,甚至是预期的 那不是你想要的。让我解释一下。
您看到旧robots.txt的原因是机架缓存。 您可以通过卷曲URL来告知验证。
值得注意的是,有一个X-Rack-Cache标头。即使你删除了 public / robots.txt,它也不存在于slug中,因为它 通过HTTP缓存存在于Rack-Cache中。 Rails将跳过整个 链,只返回缓存中的内容。尾随你会看到的日志 这在heroku路由器中:
2017-12-27T03:15:23.870134 + 00:00 heroku [router]:at = info method = GET path =“/ robots.txt”host = [隐藏] request_id = 5caea3e9-a665-4b52-b61f-c7ebf210e155 fwd =“74.108.35.53” dyno = web.1 connect = 0ms service = 4ms status = 200 bytes = 576 protocol = https
但由于这个原因,你不会看到相应的日志。你可能是 能够通过与Rack :: Cache的交互看到更多信息 设置详细。我去尝试将您的代码部署到一个新的应用程序和 无法重现这个问题。
要解决此问题,您可以尝试使用机架缓存配置 allow_revalidate:
一个布尔值,指定是否重新验证客户端发送的请求 应该受到缓存的尊重。启用此选项时 (rack-cache.allow_revalidate为true),包含a的请求 Cache-Control:max-age = 0标头使缓存承担其副本 响应过时,导致条件GET /验证 请求发送到服务器。
大多数浏览器在用户时都包含Cache-Control:max-age = 0标头 执行刷新(例如,单击“刷新”按钮)。
重要提示:全局启用此选项可使所有客户端中断 你的缓存。
应该允许您破坏该页面的缓存。如果失败了 您可以尝试通过Rails.cache.clear或清除memcache插件 通过Memcachier本身。如果你走这条路,它会吹 memcache里面的一切都消失了。
答案 1 :(得分:0)
Heroku有一个不可变的文件系统,这意味着您无法对文件系统进行更改或添加。你需要一个不同的策略。提供来自其他服务的文件,将它们放入数据库,或将它们外部链接到Amazon S3。
但我不确定我到底知道你所指的过程的确切部分。您是在谈论在构建中生成的文件,还是在运行服务期间修改的文件?
答案 2 :(得分:-1)
/public/assets
文件夹是自动生成的,因此您无法直接将文件插入其中。实际上,此文件夹应位于.gitignore
中,这可以解释您的更改未传播到生产的原因。也就是说,它们不会包含在您的提交中。
完全静态资源(例如sitemap.xml
)应该进入/public
文件夹。 js
文件和实际上是网站执行一部分的其他文件应该放在/app/assets/javascripts
之一(仅适用于此网站的代码),/lib/assets/javascripts
(适用于您公司之间共享的代码/项目),/vendor/assets/javascripts
文件夹(来自外部来源的代码)。
您可以在此处阅读更多内容:http://guides.rubyonrails.org/asset_pipeline.html