0

WebrickをサーブレットHTTPServlet::CGIHandlerで動作させることができません--EACCESエラーが発生します:

[2012-12-06 01:38:02] ERROR CGIHandler: /tmp/cgi-bin:
/Users/7stud/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpservlet/cgi_runner.rb:46:in `exec': Permission denied - /tmp/cgi-bin (Errno::EACCES)
    from /Users/7stud/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpservlet/cgi_runner.rb:46:in `<main>'
[2012-12-06 01:38:02] ERROR CGIHandler: /tmp/cgi-bin exit with 1
[2012-12-06 01:38:02] ERROR Premature end of script headers: /tmp/cgi-bin
localhost - - [06/Dec/2012:01:38:02 MST] "GET /cgi/my_prog.cgi HTTP/1.1" 500 326
- -> /cgi/my_prog.cgi

設定した権限は次のとおりです。

~/ruby_programs$ cd /
/$ ls -al tmp
lrwxr-xr-x@ 1 root  wheel  11 Jul  3  2011 tmp -> private/tmp

/$ cd tmp
/tmp$ ls -al
total 0
drwxrwxrwt  8 root   wheel  272 Dec  6 01:08 .
drwxr-xr-x@ 6 root   wheel  204 Mar 27  2010 ..
drwxr-xr-x  3 7stud  wheel  102 Dec  6 01:25 cgi-bin

/tmp$ cd cgi-bin/
/tmp/cgi-bin$ ls -al my_prog.cgi 
-rwxr-xr-x  1 7stud  wheel  123 Dec  6 01:09 my_prog.cgi

私のサーバープログラム(1.rb):

#!/usr/bin/env ruby
require 'webrick'
include WEBrick

port = 12_000
dir = Dir::pwd 

server = HTTPServer.new(
  :Port           => port,
  :DocumentRoot   => dir + "/html"
)

server.mount("/cgi", HTTPServlet::CGIHandler, "/tmp/cgi-bin")
puts "Listening on port: #{port}"

Signal.trap('SIGINT') { server.shutdown }
server.start

サーバープログラムの実行:

~/ruby_programs$ ruby 1.rb 
[2012-12-06 01:37:58] INFO  WEBrick 1.3.1
[2012-12-06 01:37:58] INFO  ruby 1.9.3 (2012-04-20) [x86_64-darwin10.8.0]
Listening on port: 12000
[2012-12-06 01:37:58] INFO  WEBrick::HTTPServer#start: pid=4260 port=12000

ブラウザに次のアドレスを入力しました。

http://localhost:12000/cgi/my_prog.cgi

これは私のブラウザに表示されました:

内部サーバーエラー

スクリプトヘッダーの早期終了:/ tmp / cgi-bin WEBrick / 1.3.1(Ruby / 1.9.3 / 2012-04-20)at localhost:12000

これが私のcgiスクリプト(/tmp/cgi-bin/my_prog.cgi)です:

#!/usr/bin/env ruby

require 'cgi'
cgi = CGI.new
puts cgi.header
puts "<html><body>Hello Webrick</body></html>"
4

2 に答える 2

1

ルート以外のディレクトリで WEBrick に cgi ファイルを実行させる唯一の方法は、HTTPServlet::FileHandler サーブレットを使用することです。

port = 12_500
...

cgi_dir = File.expand_path("~/ruby_programs/cgi-bin")
server.mount("/cgi", HTTPServlet::FileHandler, cgi_dir)

次に、cgi_dir にある .cgi ファイルを実行するために使用される URL は次のとおりです。

http://localhost:12500/cgi/my_prog.cgi

どうやら、あなたが書くとき:

server = HTTPServer.new(
  :Port           => port,
  :DocumentRoot   => "./html"  #Regular files served/.cgi files executed out of this dir
)

Webrick は、HTTPServlet::FileHandler を自動的に「マウント」して、:DocumentRoot ディレクトリへのリクエストを処理します。

http://localhost:12500/my_html.htm

これは、./html ディレクトリ (つまり、プログラムが実行されているディレクトリの下にある html というディレクトリ) からファイルを提供します。HTTPServlet::FileHandler は、拡張子が .cgi の場合、そのディレクトリ内のファイルも実行します。

mount() を明示的に使用して HTTPServlet::FileHandler を別のディレクトリに追加する場合、たとえば

cgi_dir = File.expand_path("~/ruby_programs/cgi-bin")
server.mount("/cgi", HTTPServlet::FileHandler, cgi_dir)

次に、WEBrick はそのディレクトリからファイルを提供し、そのディレクトリ内の .cgi 拡張子を持つファイルを実行します。

:DocumentRoot ディレクトリのファイルのみを提供し、別のディレクトリの .cgi ファイルのみを実行するように WEBrick を構成する方法が見つかりませんでした。

ここで「WEBrick の Gnome ガイド」を参照してください。

http://microjet.ath.cx/webrickguide/html/

于 2012-12-08T20:38:14.560 に答える
1

私の場合、ファイルのアクセス許可が正しくなく、ヘッダーが実際に正しくないために、同様の問題が発生しました。CGI スクリプトのパーミッションは次のようになります。

~/ruby_projects/cgi_webrick/cgi
ls -l
-rwxr-xr-x 1 me me  112 Sep 20 20:29 test.cgi

私のサーバー コードは非常によく似ていますが ( に配置されています~/ruby_projects/cgi_webrick/)、ハンドラーが異なります。

#!/usr/bin/env ruby

require 'webrick'

server = WEBrick::HTTPServer.new :Port => 1234 
server.mount "/", WEBrick::HTTPServlet::FileHandler , './'
trap('INT') { server.stop }
server.start

server script を実行するruby my_server_script.cgiと、ルートまたは他のディレクトリからスクリプトが提供されます。私の場合、(サブフォルダーhttp://localhost:1234/cgi/test.cgiに配置されたスクリプト)および(サーバーが起動されるルートディレクトリに配置された)にアクセスできます。cgihttp://localhost:1234/test.cgi

私のテストスクリプト:

#!/usr/bin/ruby

require 'cgi'

cgi = CGI.new
puts cgi.header
puts "<html><body>This is a test</body></html>"
于 2014-09-20T17:50:51.437 に答える