Rails 请教如何拦截 url

alexliao · April 17, 2014 · Last by swordray replied at April 19, 2014 · 2690 hits

一个用 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 Floor has deleted

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

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.