Rails 5.1.2生产环境Bootstrap Glyphicons无法加载求助
嘿,我完全懂你现在的挫败感——折腾了好几个小时的Asset Pipeline,预编译明明生成了字体文件,结果请求就是找不到正确的路径。别担心,咱们来一步步搞定这个问题:
核心问题根源
你手动修改bootstrap.css里的@font-face路径是没用的,因为Rails的Asset Pipeline在生产环境会给静态文件加上哈希值(就是你看到的那些长串字符),但你写的静态路径不会自动替换成带哈希的版本,导致请求的是不带哈希的字体文件,自然找不到。
解决方案步骤
把Bootstrap CSS转成Sass文件
把app/assets/stylesheets/bootstrap.css重命名为bootstrap.scss,这样我们就能用Rails提供的Sass资产辅助函数来处理路径了。修改@font-face的路径引用
打开重命名后的bootstrap.scss,把原来的url()替换成Rails的asset-url()辅助函数,修改后的代码如下:@font-face { font-family: 'Glyphicons Halflings'; src: asset-url('glyphicons-halflings-regular.eot'); src: asset-url('glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), asset-url('glyphicons-halflings-regular.woff2') format('woff2'), asset-url('glyphicons-halflings-regular.woff') format('woff'), asset-url('glyphicons-halflings-regular.ttf') format('truetype'), asset-url('glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); }这个函数会在预编译时自动把路径替换成带哈希的正确文件名,比如
/assets/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf。确保字体文件放在正确目录
把所有Glyphicons字体文件(.eot、.woff2、.woff、.ttf、.svg)移到app/assets/fonts/目录下——这是Rails Asset Pipeline默认扫描字体文件的位置,如果这个目录不存在就新建一个。清理旧的预编译文件并重新编译
先删除之前生成的预编译资产,避免缓存干扰:rm -rf public/assets/*然后重新执行预编译命令:
rake assets:precompile RAILS_ENV=production检查生产环境配置(可选)
确保config/environments/production.rb里的以下配置正确:config.assets.compile = false:生产环境下不需要动态编译资产,Heroku默认也会遵循这个设置config.assets.digest = true:这个默认是开启的,确保资产文件名带哈希值
针对Heroku的额外注意点
Heroku会在部署时自动执行资产预编译,但如果之前遇到过问题,可以在部署前手动预编译,或者确保你的Gemfile里没有禁用相关功能(Rails 5之后不需要rails_12factor gem了,Heroku默认支持)。
这样操作之后,再启动生产环境服务器或者部署到Heroku,Glyphicons应该就能正常加载了!
内容的提问来源于stack exchange,提问作者Just Matt for now

