我在做图片上传和裁剪,使用 CarrierWave 下载图片在 public 的 uploads 目录下(uploads 目录下还有两级目录是截取图片的名字的前两位自动生成的,保存的图片的名字是根据 MD5 加密生成),在 production 环境下显示不出来,但是在 development 环境下正常。
log 报错信息如下: ActionController::RoutingError (No route matches [GET] "/uploads/photo/cc/55/large_cc55a8a500951a2c9390ec8246179830.jpg");但是目录下有图片。 曾试着把 config.serve_static_assets = false 改为 true,图片能显示,但项目都是乱码了而且官方也不建议这么改 这问题折磨我一星期了,求高手指教
我获取图片是用的 image_tag <%=image_tag @photo.remote_photo_path, alt: @user.photos.first.image,:size => "140x160" ,:class=> 'change_photo' %> remote_photo_path 是我保存的图片的路径
carrierwave 教程上使用了 image_url 方法获取图片<%=image_tag(@photos.image_url(:large)%>,但是我生成了子目录保存的图片后就把图片的/uploads/photo/cc/55/large_cc55a8a500951a2c9390ec8246179830.jpg 路径保存在 remote_photo_path 数据库字段内,这样在 development 模式下时正常的,但是 production 下一直不显示,也试过<%=image_tag(@photos.image_url(:large)%>这种方法也不行
这应该不是程序的问题。你检查一下 production 和 development 配置有什么不同,比如:production 是不是用 web server 跑的,是不是 public 下面的都不能访问还是只是 upload 的目录无法访问,直觉像是 web server 禁止了特定目录的访问
upstream yan_server { server unix:/tmp/unicorn.hmp.sock;
} server { listen 80; server_name localhost;
access_log /home/yan/deploy/tmp/log/access.log; error_log /home/yan/deploy/tmp/log/error.log; root /home/yan/deploy/current/public; index index.html;
location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby; }
location @ruby { proxy_pass http://yan_server; } }
public 目录下的静态文件,一般都建议单独由 lighttpd、nginx 这类服务器来提供服务 可以单独使用静态域名访问,比如 i.himysql.com 不使用单独域名的话,在 nginx 加上 location ~* .(jpg|png|bmp|gif) { root /your/project/path/public; }
rails 3 的 production 环境默认不处理静态请求。静态请求用 nginx 处理。
不过也可以在 production.rb 处理。但是不应该
#10 楼 @zlx_star #12 楼 @leopku #14 楼 @zhangyuan 谢谢你们的帮助,我终于知道什么问题了,之前把 config.serve_static_assets = false 改为 true 和今天把 nginx 按照楼上说的配置了以后一样出现乱码,好多功能不能用,现在才恍然大悟,原来我把 public 目录暴露出后,在 production 环境会自动生成 index.html 缓存页面,在根目录下会首先自动加载这个缓存页面,所以一直出现乱码。把 config.action_controller.perform_caching = true 改为 false 就正常了,太大意了之前一直以为是 config.serve_static_assets=true 导致的所以没仔细琢磨这个乱码问题。 谢谢大家的热心帮助
rails2.x 的版本中,还支持 / 直接从 public 中直接读资源,后面就不支持了。 使用 ruby server 读静态资源确实会浪费一些性能,在 3 以后变成推荐使用 nginx 读静态资源了。