0

我编写了一些 ruby​​ CGI 脚本(使用 Ruby CGI 类),我使用 lighttpd 从我的生产服务器提供这些脚本。我想在我的开发服务器上使用 Thin 测试它们。基本上,我想将我所有的 CGI 脚本放在一个目录中,然后在该目录中开始精简。然后,对http://localhost:3000/<script >的任何请求都应该在当前目录中执行 <script> 并返回结果。如果瘦有这样做的内置方式,我找不到它。如果您知道自己在做什么,我会想象机架配置文件很容易,但我不知道。

更新:

这个机架文件似乎工作。我不确定这是否是最好的解决方案,但对于开发环境来说应该没问题。

run(lambda do |env|
  require 'rubygems'
  require 'systemu'
  script = env['REQUEST_PATH'][1..-1] + '.rb'
  response = '' 
  err = ''
  systemu(['ruby', script], 'stdout' => response, 'stderr' => err, 'env' => { 
    'foo' => 'bar' })
  if err.length > 0 
    [ 500, {'Content-Type' => 'text/plain'}, err ]
  else
    idx = 0
    status = -1
    headers = {}
    while true
      line_end = response.index("\n", idx)
      line = response[idx..line_end].strip
      idx = line_end+1

      if status < 0
        if line =~ /(\d\d\d)/
          status = $1.to_i
        else
          raise "Invalid status line: #{line}"
        end
      elsif line.empty?
        break
      else
        name, value = line.split /: ?/
        headers[name] = value
      end
    end
    content = response[idx..-1]
    [status, headers, content]
  end
end)
4

1 回答 1

0

我有点不清楚为什么 Rack 是必要的。如果您使用 Ruby 的内置 CGI 模块编写脚本,您应该能够告诉thin 将目录视为一个cgi-bin,就像Apache ScriptAlias 指令一样,Ruby CGI 将处理其余的事情。如果瘦不能做到这一点,也许 lighttpd 会是一个更好的解决方案。

于 2011-02-01T18:48:41.367 回答