我可以在请求处理程序之外获取Rack服务的基本URL吗?

时间:2012-01-18 18:43:22

标签: ruby rack

我希望能够从config.ru中的Rack初始化代码中检索我的Web应用程序的基本URL。有点像:

puts "Starting up on http://#{ENV['SERVER_NAME']}:#{ENV['SERVER_PORT']}/#{ENV['MOUNT_POINT']}..."

但是我还没有找到任何可以从请求处理程序外部获得的内容。显然,我可以做类似的事情:

...
def get
  puts "Got a request for #{ENV['rack.url_scheme']}://#{ENV['HTTP_HOST']}#{ENV['REQUEST_PATH']}"
  ...

因为请求是在那时定义的。但是在配置文件的开头,似乎没有定义这些变量。

我可以使用Rack方法来访问此信息吗?这是在Rack启动完成之前还没有最终确定的情况之一吗?我似乎记得其他框架有一种方法将proc传递给一个方法,一旦环境“准备好”就会执行它。 Rack有这样的东西吗?

2 个答案:

答案 0 :(得分:2)

我不相信Rack应用程序可以提前知道“挂载点”。例如,此config.ru在多个挂载点安装相同的应用程序:

require 'rack'

app = proc { |env|
  [200, {'Content-Type' => 'text/plain'}, ['hello, world!']]
}

run Rack::URLMap.new('/myapp' => app,
                     '/' => app)

Rack也没有提供在初始化时调用的任何标准方法。我怀疑这是因为Rack试图支持普通的CGI,其中可以创建整个Ruby进程来处理每个请求,并且每个请求都会退出该进程。在那种情况下,“init”方法没有多大用处。

答案 1 :(得分:2)

大约一年后,我正在努力解决同样的问题并找到了你的主题。

每个Rack应用程序都提供一个由Rack处理程序调用的调用方法。例如,请参阅Sinatra :: Base#call的代码。每个请求调用一次此调用方法,并且有一个参数是包含环境变量的哈希。在这些内容中,您需要的一切都是您所要求的“mount_point”,称为“SCRIPT_NAME”。

有关详细信息,请参阅http://www.rubydoc.info/github/rack/rack/file/SPEC。不幸的是,这些信息仅在请求期间提供给您,而不是在我知道之前。希望它能帮助别人。