Raging上的资产管道:正确的指纹,但404ing

时间:2011-12-08 02:33:39

标签: ruby-on-rails asset-pipeline production staging sprockets

我正在运行Rails 3.1.3,其中包括Sprockets 2.0.3作为依赖项。

我按照Rails指南为生产建议的方式设置我的暂存环境。

config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true

我已加入我的Capfile

load 'deploy'
load 'deploy/assets'

资产在部署时按预期进行预编译。

在公共/资产方面,我发现资产符合预期的指纹。

application-bd402855d34fb61e0a1690da06f79f20.js
application-bd402855d34fb61e0a1690da06f79f20.js.gz
application-ed3f9a8d23992790841c11b6692fb576.css
application-ed3f9a8d23992790841c11b6692fb576.css.gz
...and a bunch of images...

当我加载页面时,我看到了正确的引用,指纹和所有。

<link href="/assets/application-ed3f9a8d23992790841c11b6692fb576.css" media="screen" rel="stylesheet" type="text/css">
<script src="/assets/application-bd402855d34fb61e0a1690da06f79f20.js" type="text/javascript"></script>

然而,所有404s,css,js,图像,一切。

任何人都知道这笔交易是什么?谢谢!

5 个答案:

答案 0 :(得分:1)

尽管有其他答案的建议

config.assets.compile = true

...是一种解决方法,而不是解决方案。此选项使Rails可以回退到公共/资产中无法找到的资产的动态编译。它可能会“解决”您的暂存问题,但在运行时让Rails编译资产在生产中并不是最佳选择。

我记得在使用Rails 3.1.x中的新资产管道的最初几个月,我遇到了压缩和生成摘要的问题,我只是在以后的版本中解决了这个问题。我建议你试试

config.assets.compress = false
config.assets.digest = false

单独和一起。和/或升级到更高版本的Rails或资产管道宝石。

答案 1 :(得分:1)

如果您确定资产正在编译并存在于公共目录中,那么它可能是您的Web服务器设置吗?在生产/登台环境中,资产不应该访问rails应用程序并直接从Web服务器提供。下面是一个示例apache config snippet:

   <LocationMatch "^/assets/.*$">
      Header unset ETag
      FileETag None
      # RFC says only cache for 1 year
      ExpiresActive On
      ExpiresDefault "access plus 1 year"

      SetEnv no-gzip
      RewriteEngine on
      # Make sure the browser supports gzip encoding before we send it
      RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
      RewriteCond %{REQUEST_FILENAME}.gz -s
      RewriteRule ^(.+) $1.gz [L]

   </LocationMatch>

   <FilesMatch \.css\.gz$>
      ForceType text/css
      Header set Content-Encoding gzip
   </FilesMatch>

   <FilesMatch \.js\.gz$>
      ForceType text/javascript
      Header set Content-Encoding gzip
   </FilesMatch>

答案 2 :(得分:0)

config.assets.compile = false

应该是:

config.assets.compile = true

另外,请确保清除缓存:

bundle exec rake tmp:cache:clear

并重新启动服务器。

答案 3 :(得分:0)

几个月前我遇到了同样的问题。由于一些原因,我选择手动触发生产中的资产编译,因此我的production.rb已经

config.assets.compile = false

并且通过capistrano部署还有一个预编译资产的任务(使用rvm):

run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile", shell: fetch(:rvm_shell)

最后一步是确保我们对资产文件夹进行符号链接,以便我们不需要重新编译未更改的资产。

run "ln -nfs #{shared_path}/assets #{release_path}/public/assets"

答案 4 :(得分:-1)

config.assets.compile = false

应该是真的