【问题标题】:ruby equivalent of php's $_SERVER['REQUEST_URI']ruby 相当于 php 的 $_SERVER['REQUEST_URI']
【发布时间】:2014-10-17 05:30:36
【问题描述】:

我是红宝石新手。我在 Ubuntu 上安装了 apache 的 phusion-passenger。 php 的 $_SERVER['REQUEST_URI'] 或任何 php 的 $_SERVER 变量是否有 ruby​​ 等效项?

我没有使用 Sinatra 或 rails,因为我只是想先学习如何使用 ruby​​。

【问题讨论】:

  • 如果你只想学习Ruby,那么你甚至不需要使用Passenger或Apache,你只需要Ruby。您需要的变量是标准的,并且是通过环境表从 Apache 传递的,所以,是的,Ruby 可以通过查看 ENV 来查看它们,但是您应该依靠框架来检索这些变量并将它们传递给您。

标签: ruby passenger


【解决方案1】:

当你有一个像这样的简单机架服务器时:

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']

有关如何使用 Rack 的更多示例,请参阅 http://hawkins.io/2012/07/rack_from_the_beginning/

【讨论】:

  • @John:我更新了我的代码。请将[200, {}, env.inspect] 更改为[200, {}, [env.inspect]]
  • 我再次更新了我的答案(config.ru 的最后一行)。似乎自写博客文章以来,Rack API 发生了显着变化。很抱歉,我目前无法在当前机器上测试代码。
  • 好的!有效。它还为我提供了每次页面加载时的新查询字符串值,这回答了我的另一个问题。感谢您帮助新手!
  • 这是我的另一个问题stackoverflow.com/questions/26412341/… 的链接。你可以说这个问题的答案也是这个问题的答案,那我可以接受。否则,如果我回答自己的问题,我必须等待 2 天才能接受。
【解决方案2】:

我没有使用 Sinatra 或 rails,因为我只是想先学习如何使用 ruby​​。

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 的角色和职责……所以当出现问题时,我经常在故障排除中走错路。这就是为什么我认为也许我应该坚持基本要素,在学习下一件事之前先习惯它。
  • 暂时只使用 Ruby 和 Sinatra,忘记在 Apache 和Passenger 中的接线。一旦您了解了 Ruby、Rack 和 Sinatra、Padrino 或 Rails 的工作原理,那么其余部分将更容易理解。
猜你喜欢
  • 2011-09-22
  • 2011-09-29
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多