gpt4 book ai didi

ruby - 如何为 Rack 挂载静态文件

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:28 26 4
gpt4 key购买 nike

我想通过 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 和瘦服务器的系统。我写了以下内容,但无法获取提供的静态文件。应该如何更改才能使其发挥作用?

    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::StaticRack::FileRack::Directory。请教我。

最佳答案

您需要使用 Rack::Builder为了在普通的 Ruby 脚本中使用 use SomeMiddleware 语法(它通常在 config.ru 文件中使用)。您还需要为您的应用程序run。请注意 Rack::Staticurls 键采用数组,而不是单个字符串:

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 应用程序中。 Rack::FileRack::Directory 本身都是 Rack 应用程序,而不是中间件(Rack::Static 使用 Rack::File 内部,默认情况下 Rack::Directory 也是如此)。您可以使用 Rack::Filemap 命令实现与上面相同的效果:

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)

更常见的方法是将传递给 Rack::Bundler.new 的 block 的内容放在 config.ru 文件中:

use(Rack::Static, urls: ["/resource/"], root: "/") 
run ->env{[200, {}, [some_dyamically_generated_content]]}

然后您可以使用 thin start 运行它,如果从同一目录运行它应该找到 config.ru,或者您可以使用 -R 选项来指定文件。 rackup 命令也可以使用,rackup -s thin 如果你想指定 Thin 作为服务器。

关于ruby - 如何为 Rack 挂载静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8801777/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com