加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何为Rack安装静态文件

发布时间:2020-12-17 02:42:58 所属栏目:百科 来源:网络整理
导读:我想通过Rack提供静态文件以及动态内容.以前,我使用WEBrick而不使用Rack,代码是这样的,它起作用了: @s = WEBrick::HTTPServer.new( Port: 3000,BindAddress: "localhost",Logger: WEBrick::Log.new(File::NULL),AccessLog: [nil,nil] ) %w[INT TERM].each{|
我想通过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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读