我希望能够从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有这样的东西吗?
答案 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。不幸的是,这些信息仅在请求期间提供给您,而不是在我知道之前。希望它能帮助别人。