Rack中间件中的“env”变量是什么?

我知道Rack中间件filter是一个带有初始化和调用方法的Ruby类。 我知道call方法采用“env”参数。 像这样的东西:

class MyFilter def initialize(app) end def call(env) end end 

我的问题是:发送给“呼叫”的“env”参数究竟是什么? 这与Rails ENV环境(即开发,测试,生产)相同。

谢谢!

env只是一个哈希。 机架本身和各种中间件为其增添了价值。

要了解哈希中各种键的内容,请查看机架规范 。

这是一个示例env哈希:

 { "GATEWAY_INTERFACE" => "CGI/1.1", "PATH_INFO" => "/index.html", "QUERY_STRING" => "", "REMOTE_ADDR" => "::1", "REMOTE_HOST" => "localhost", "REQUEST_METHOD" => "GET", "REQUEST_URI" => "http://localhost:3000/index.html", "SCRIPT_NAME" => "", "SERVER_NAME" => "localhost", "SERVER_PORT" => "3000", "SERVER_PROTOCOL" => "HTTP/1.1", "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)", "HTTP_HOST" => "localhost:3000", "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0", "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3", "HTTP_ACCEPT_ENCODING" => "gzip, deflate", "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61", "HTTP_CONNECTION" => "keep-alive", "HTTP_CACHE_CONTROL" => "max-age=0", "rack.version" => [1, 2], "rack.input" => #, "rack.errors" => #>, "rack.multithread" => true, "rack.multiprocess" => false, "rack.run_once" => false, "rack.url_scheme" => "http", "HTTP_VERSION" => "HTTP/1.1", "REQUEST_PATH" => "/index.html" } 

为了更容易使用,请检查Rack :: Request ,这样可以更轻松地访问env哈希中的值。

我建议您可以尝试使用简单的编程来打印’env’变量。

 require "rubygems" require "rack" def pp(hash) hash.map {|key,value| "#{key} => #{value}"}.sort.join("
") end Rack::Handler::WEBrick.run lambda {|env| [200,{},[pp(env)]]} , :Port=>3000

输入localhost:3000链接

env变量是一个哈希,它包含许多有用的信息,包括请求头和主体,以及可能由上游中间件添加的运行时环境数据。

根据您拥有的Web服务器查看源代码 ,您可以在env哈希中获得不同的值。 我建议使用文档中的内容 。

基本上,env是特定于Web服务器的请求对象的哈希版本。 Rack做了一些工作来提供规范化的环境,因此中间件可以在Web服务器上保持一致。