ruby – 如何为Rack安装静态文件
我想通过Rack提供静态文件以及动态内容.以前,我使用WEBrick而不使用Rack,代码是这样的,它起作用了:
@s = WEBrick::HTTPServer.new( Port: 3000,BindAddress: "localhost",Logger: WEBrick::Log.new(File::NULL),AccessLog: [nil,nil] ) %w[INT TERM].each{|signal| trap(signal){@s.shutdown}} @s.mount("/",self) @s.mount("/resource/",WEBrick::HTTPServlet::FileHandler,"/") @s.start 在上面,对localhost:3000的请求将由动态内容响应,对localhost:3000 / resource / path_to_file的请求将由位于我的计算机上的/ path_to_file的静态文件响应. 现在,我想切换到使用Rack with Thin server的系统.我写了以下内容,但无法获取所提供的静态文件.应如何改变以使其有效? Rack::Handler::Thin.run(->env{ h = Rack::Utils.parse_nested_query(env["QUERY_STRING"]) # I tried the following three lines one at a time,but neither worked. use(Rack::Static,urls: "/resource/",root: "/") # First try Rack::File.new("/resource").call(env) # Second try Rack::Directory.new("/resource").call(env) # Third try [200,{},[some_dyamically_generated_content]] },Port: 3000) 我知道这是一个类似的问题:How to serve static files via Rack?,但我无法使它工作.我不知道如何使用Rack :: Static,Rack :: File或Rack :: Directory.请教我. 解决方法
您需要使用
Rack::Builder 才能在普通的Ruby脚本中使用SomeMiddleware语法(通常在config.ru文件中使用).您还需要运行您的应用程序.请注意,Rack :: Static的url键是一个数组,而不是一个字符串:
require 'rack' Rack::Handler::Thin.run(Rack::Builder.new { use(Rack::Static,urls: ["/resource/"],root: "/") run ->env{[200,[some_dyamically_generated_content]]} },Port: 3000) 这里Rack :: Builder正在使用你的应用程序 – > env {[200,[some_dyamically_generated_content]]},将Rack :: Static中间件添加到它并创建一个新的组合应用程序,然后传递给Thin运行. Rack :: Static是一个中间件组件,可以添加到现有的机架应用程序中. Rack :: File和Rack :: Directory本身都是机架应用程序,而不是中间件(Rack :: Static在内部使用Rack :: File,默认情况下也是Rack :: Directory).您可以使用Rack :: File和map命令获得与上面相同的效果: require 'rack' Rack::Handler::Thin.run(Rack::Builder.new { map "/resource/" do run Rack::File.new "/" end map "/" do run ->env{[200,[some_dyamically_generated_content]]} end },Port: 3000) 更常见的方法是将块的内容传递给config.ru文件中的Rack :: Bundler.new: use(Rack::Static,root: "/") run ->env{[200,[some_dyamically_generated_content]]} 然后,您可以使用瘦启动运行它,如果从同一目录运行,则应该找到config.ru,或者您可以使用-R选项指定文件.如果要将Thin指定为服务器,也可以使用rackup命令,rackup -s thin. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |