我是新來的紅寶石。我在Ubuntu上安裝了apache的phusion-passenger。對於php的$ _SERVER ['REQUEST_URI']或任何php的$ _SERVER變量,是否有Ruby等價物?
我不使用Sinatra或鋼軌,因爲我只是想學習如何使用紅寶石第一。
我是新來的紅寶石。我在Ubuntu上安裝了apache的phusion-passenger。對於php的$ _SERVER ['REQUEST_URI']或任何php的$ _SERVER變量,是否有Ruby等價物?
我不使用Sinatra或鋼軌,因爲我只是想學習如何使用紅寶石第一。
當你有這樣一個簡單的機架式服務器:
require 'rack'
require 'rack/server'
class EnvInspector
def self.call(env)
[200, {}, [env.inspect]]
end
end
run EnvInspector
它會回報你這樣的事情,告訴你在env
變量的所有鍵:
{
"SERVER_SOFTWARE"=>"thin 1.4.1 codename Chromeo",
"SERVER_NAME"=>"localhost",
"rack.input"=>#<StringIO:0x007fa1bce039f8>,
"rack.version"=>[1, 0],
"rack.errors"=>#<IO:<STDERR>>,
"rack.multithread"=>false,
"rack.multiprocess"=>false,
"rack.run_once"=>false,
"REQUEST_METHOD"=>"GET",
"REQUEST_PATH"=>"/favicon.ico",
"PATH_INFO"=>"/favicon.ico",
"REQUEST_URI"=>"/favicon.ico",
"HTTP_VERSION"=>"HTTP/1.1",
"HTTP_HOST"=>"localhost:8080",
"HTTP_CONNECTION"=>"keep-alive",
"HTTP_ACCEPT"=>"*/*",
"HTTP_USER_AGENT"=>
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
"HTTP_ACCEPT_ENCODING"=>"gzip,deflate,sdch",
"HTTP_ACCEPT_LANGUAGE"=>"en-US,en;q=0.8",
"HTTP_ACCEPT_CHARSET"=>"ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"HTTP_COOKIE"=> "_gauges_unique_year=1; _gauges_unique_month=1",
"GATEWAY_INTERFACE"=>"CGI/1.2",
"SERVER_PORT"=>"8080",
"QUERY_STRING"=>"",
"SERVER_PROTOCOL"=>"HTTP/1.1",
"rack.url_scheme"=>"http",
"SCRIPT_NAME"=>"",
"REMOTE_ADDR"=>"127.0.0.1",
"async.callback"=>#<Method: Thin::Connection#post_process>,
"async.close"=>#<EventMachine::DefaultDeferrable:0x007fa1bce35b88
}
所以env['REQUEST_URI']
將等價於PHP中的$_SERVER['REQUEST_URI']
見http://hawkins.io/2012/07/rack_from_the_beginning/更多的例子來說明如何使用架。
@John:我更新了我的代碼。請將'[200,{},env.inspect]'改爲'[200,{},[env.inspect]]'。 – spickermann 2014-10-16 21:14:33
我再次更新了我的答案(config.ru的最後一行)。似乎自從博客文章寫入以來,Rack API發生了顯着變化。我很抱歉,但我目前無法測試當前機器上的代碼。 – spickermann 2014-10-16 21:26:44
好吧!有效。它還爲我提供了每個頁面加載時的新查詢字符串值,這可以解答我的另一個問題。感謝您幫助newb! – John 2014-10-16 21:31:48
我不使用Sinatra或鋼軌,因爲我只是想學習如何使用紅寶石第一。
Ruby不假定Web服務器。它是一種通用編程語言,可以獨立運行。如果您使用的是Web開發框架,它將爲您提供對這些數據的訪問。
Rails和Sinatra都使用Rack,它使用request object來訪問這些數據。 REQUEST_URI
變量對應於包含查詢字符串的路徑;該fullpath
方法用於訪問它:
# get '/articles'
request.fullpath # => '/articles'
# get '/articles?page=2'
request.fullpath # => '/articles?page=2'
基本API是在所有這些框架相同。供參考:
謝謝。我一直在努力區分乘客,apache,ruby,Sinatra的角色和職責,所以我一直在失去時間......所以當出現問題時,我經常在我的故障排除中走錯了路。這就是爲什麼我認爲我應該堅持要領,在學習下一個東西之前先熟悉它。 – John 2014-10-16 21:10:34
現在只需與Ruby和Sinatra一起工作,並忘記了Apache和Passenger中的接線。一旦你瞭解了Ruby,Rack和Sinatra,Padrino或Rails如何工作,其餘部分將更容易理解。 – 2014-10-16 22:20:40
如果你只是想學習Ruby,那麼你甚至不需要使用Passenger或Apache,你只需要Ruby。你所追求的變量是標準的,並且通過環境表從Apache傳遞,因此,Ruby可以通過查看'ENV'來看到它們,但是你應該依賴框架來檢索這些變量並將它們傳遞給你。 – 2014-10-16 22:18:29