如何通过Rack提供静态文件服务?

41

我目前正在开发一个基于Rack的应用程序,并希望重定向所有文件请求(例如filename.filetype)到指定的文件夹。

Rack::Static仅支持特定文件夹(例如“/media”)的文件请求。

我必须编写自己的Rack中间件,还是存在现成的解决方案?

4个回答

40

为了将每个请求重定向到特定路径,请使用Rack::File(因为某些原因,最近的文档中缺少此类,但它仍然是最新版Rack的一部分):

run Rack::File.new("/my/path")

要重定向每个请求,并在目标目录中添加所有文件的HTML索引,请使用Rack::Directory

run Rack::Directory.new("/my/path")

要合并几个目录或仅从目标目录服务于一些请求:

map "/url/prefix" do
  run Rack::File.new("/my/path")
end

# More calls to map if necessary...

# All other requests.
run MyApp.new

我不得不使用 map "/" do..end 包装 run MyApp.new。否则,我会收到一个未定义的调用方法错误。(不知道为什么。) - Venkat D.

14
更新:最新的Rack实现让您可以使用Rack::Static
示例:
use Rack::Static, :urls => ["/media"]

将服务于 ./media 文件夹下的所有静态资源,相对于 config.ru 的位置。


11

你可能可以直接使用Rack::File。下面是一个config.ru文件,你可以插入到rackup中查看它的工作方式:

app = proc do |env|
  Rack::File.new('foo/bar').call(env)
end

run app

2
run Rack::Directory.new(Dir.pwd)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接