Rails 请教如何拦截 url

alexliao · 2014年04月17日 · 最后由 swordray 回复于 2014年04月19日 · 2688 次阅读

一个用 Rails 3, Apache 2, Passenger 搭建的网站后台,包含上传下载文件的功能。原先在下载页面的下载链接直接指向文件路径,比如 http://xxx.com/files/doc1.doc ,下载直接由 Apache 完成,不经过 Rails 程序。现在想增加下载次数统计功能,每下载一次在数据库里增加一条记录。

由于文件下载链接已扩散到很多地方,不能修改,想要把原来的链接 route 到 Rails 程序。在 routes.rb 里设置了 match '/files/*filename' => 'files#download' 发现不管用,仍然直接由 Apache 提供下载。除非访问硬盘上不存在的文件,才会调用到 files controller 的 download action

请问应该怎样才能让该 url 优先调用 Rails 程序?

把原始的文件目录移动或改名,比如:mv public/files xxx; route 配置成以前的下载 url 形式,比如:get 'files/:filename' => 'files#download'

public 里面找不到资源才会走路由,所以楼上 +1

#1 楼 @beiersi 这个方法管用,我试过。但是由于原始文件目录改名,需要相应改动上传原始文件的代码,容易出错。还是想知道有没有更简单的方法。

监听下载链接事件,先异步发个请求到后台服务器,然后不要 e.preventDefault()

是不是 Apache 的配置让针对 files/* 的请求没有 dispatch 到 Passenger?

正确的方式是:XSendfile

7 楼 已删除

#5 楼 @reyesyang Apache 里没有任何特别的配置,默认就是先找静态文件,找不到才 dispatch 到 Passenger. 不知道如何改变这个默认行为。

下载次数统计没必要这样搞吧,又不是有很高一致性要求的东西,用户根本不关心的,直接在 apache 里 log 了,再整个定时任务一次性分析 log 丢回数据库不行么

files 目录不要放到 apache 的 doc root 里面吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号