Je ne peux pas obtenir que Webrick fonctionne avec le servlet HTTPServlet :: CGIHandler - Je reçois une erreur 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
Voici les autorisations que j'ai définies:
~/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
Mon programme serveur (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
Exécuter mon programme serveur:
~/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
J'ai entré cette adresse dans mon navigateur:
http://localhost:12000/cgi/my_prog.cgi
Cela a été affiché dans mon navigateur:
Erreur Interne du Serveur
Fin prématurée des en-têtes de script: / tmp / cgi-bin WEBrick / 1.3.1 (Ruby / 1.9.3 / 2012-04-20) chez localhost: 12000
Voici mon script 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>"
Réponses:
1 pour la réponse № 1La seule manière pour que WEBrick puisse exécuter des fichiers cgi dans un répertoire autre que la racine est d'utiliser le servlet HTTPServlet :: FileHandler
port = 12_500
...
cgi_dir = File.expand_path("~/ruby_programs/cgi-bin")
server.mount("/cgi", HTTPServlet::FileHandler, cgi_dir)
Ensuite, l'URL utilisée pour exécuter un fichier .cgi situé dans le répertoire cgi_dir est:
http://localhost:12500/cgi/my_prog.cgi
Apparemment, quand tu écris:
server = HTTPServer.new(
:Port => port,
:DocumentRoot => "./html" #Regular files served/.cgi files executed out of this dir
)
Webrick "monte" automatiquement un HTTPServlet :: FileHandler pour gérer les demandes dans le répertoire: DocumentRoot, par exemple.
http://localhost:12500/my_html.htm
qui servira les fichiers en dehors du répertoire ./html (c’est-à-dire un répertoire appelé html situé sous le répertoire à partir duquel votre programme est exécuté). HTTPServlet :: FileHandler sera également exécuter les fichiers de ce répertoire s’ils ont une extension .cgi.
Si vous utilisez explicitement mount () pour ajouter un HTTPServlet :: FileHandler à un autre répertoire, par exemple.
cgi_dir = File.expand_path("~/ruby_programs/cgi-bin")
server.mount("/cgi", HTTPServlet::FileHandler, cgi_dir)
WEBrick servira également les fichiers de ce répertoire et exécutera les fichiers de ce répertoire ayant une extension .cgi.
Je n ’" ai pas trouvé le moyen de configurer WEBrick pour ne servir que les fichiers du répertoire: DocumentRoot et exécuter uniquement les fichiers .cgi dans un autre répertoire.
Voir le "Guide de WEBrick" de Gnome "ici:
http://microjet.ath.cx/webrickguide/html/
1 pour la réponse № 2
Dans mon cas, j'avais des problèmes similaires à cause d'autorisations de fichiers incorrectes et d'en-têtes vraiment incorrects. Les autorisations de CGI-script devraient être comme ceci:
~/ruby_projects/cgi_webrick/cgi
ls -l
-rwxr-xr-x 1 me me 112 Sep 20 20:29 test.cgi
Le code de mon serveur est très similaire (placé dans ~/ruby_projects/cgi_webrick/
), mais avec un gestionnaire différent.
#!/usr/bin/env ruby
require "webrick"
server = WEBrick::HTTPServer.new :Port => 1234
server.mount "/", WEBrick::HTTPServlet::FileHandler , "./"
trap("INT") { server.stop }
server.start
Si vous exécutez un script serveur ruby my_server_script.cgi
, il servira tous les scripts de la racine ou d’un autre répertoire. Dans mon cas, je peux accéder http://localhost:1234/cgi/test.cgi
(script placé dans cgi
sous-dossier), et http://localhost:1234/test.cgi
(placé dans le répertoire racine à partir duquel le serveur est démarré).
Mon script de test:
#!/usr/bin/ruby
require "cgi"
cgi = CGI.new
puts cgi.header
puts "<html><body>This is a test</body></html>"