Ruby on rails 暂存上的Rails资产管道:正确的指纹,但不包含404
我正在运行Rails 3.1.3,其中包含链轮2.0.3作为依赖项 我将登台环境设置为按照Rails指南建议的生产方式进行配置Ruby on rails 暂存上的Rails资产管道:正确的指纹,但不包含404,ruby-on-rails,asset-pipeline,production,staging,sprockets,Ruby On Rails,Asset Pipeline,Production,Staging,Sprockets,我正在运行Rails 3.1.3,其中包含链轮2.0.3作为依赖项 我将登台环境设置为按照Rails指南建议的生产方式进行配置 config.serve_static_assets = false config.assets.compress = true config.assets.compile = false config.assets.digest = true 我已将其包含在我的CAP文件中 load 'deploy' load 'deploy/assets' 并且资产在部署时按预
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
我已将其包含在我的CAP文件中
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、图像等等
有人知道这是怎么回事吗?谢谢
config.assets.compile = false
应该是:
config.assets.compile = true
此外,请确保清除缓存:
bundle exec rake tmp:cache:clear
然后重新启动服务器
config.assets.compile = false
这应该是真的尽管其他答案中有建议
config.assets.compile = true
…是一种解决方法,而不是解决方案。此选项使Rails能够返回到对公共/资产中找不到的资产的动态编译。它可能会“解决”您的登台问题,但让Rails在运行时编译资产在生产中并不完全是最佳的
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
我记得在Rails3.1.x中使用新资产管道的最初几个月里,我在压缩和生成摘要方面都遇到了问题,我只是在以后的版本中才真正解决了这些问题。我建议试试看
config.assets.compress = false
config.assets.digest = false
无论是单独还是一起。和/或升级到更高版本的Rails或资产管道gems。几个月前我遇到了同样的问题。出于几个原因,我选择在生产中手动触发资产编译,因此my production.rb
config.assets.compile = false
通过capistrano部署,还需要预编译资产(同时使用rvm):
最终的步骤是确保我们将资产文件夹符号化,这样我们就不需要重新编译未更改的资产
run "ln -nfs #{shared_path}/assets #{release_path}/public/assets"
如果您确定这些资产正在编译并存在于公共目录中,是否可能是您的web服务器设置?在生产/登台环境中,资产不应该进入rails应用程序,而是直接从web服务器提供服务。下面是一个apache配置代码段示例:
<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>
标题未设置ETag
FileTag无
#RFC表示缓存只能使用1年
过期于
ExpiresDefault“访问权限加1年”
SetEnv no gzip
重新启动发动机
#在发送之前,请确保浏览器支持gzip编码
RewriteCond%{HTTP:Accept Encoding}\b(x-)?gzip\b
RewriteCond%{REQUEST_FILENAME}.gz-s
重写规则^(+)$1.gz[L]
强制类型文本/css
标题集内容编码gzip
ForceType文本/javascript
标题集内容编码gzip
您是以“生产”的形式运行staging,还是有staging.rb配置文件?如果是这样,您可能没有正确的管道选项。我想要几乎相同的行为。不是吗?应该没问题。我会再考虑一下…我在生产模式中也有同样的问题。使用完全相同版本的rails ruby和sprocket在本地进行测试。您是否尝试过在预编译之前执行rake assets:clean?您的暂存环境应该与您的生产环境相同,因为这是整个暂存点。