I want to use Ruby in Apache through CGI. I have the following in my configuration file:
DocumentRoot /home/ceriak/ruby
<Directory /home/ceriak/ruby>
Options +ExecCGI
AddHandler cgi-script .rb
</Directory>
test.rb
is a testfile placed under /home/ceriak/ruby/
, #!/usr/bin/ruby
included on the first line and given executable permissions. Still, when I visit localhost/test.rb
I get a download window and can obtain the source code.
Interestingly, when I place the same script under /usr/lib/cgi-bin/
and call localhost/cgi-bin/test.rb
it works as supposed.
(Apache2 on Ubuntu 9.10.)
Any idea?
Few things to check:
- is your file executable? You can make it executable by going
chmod +x /path/to/file
- did you output the correct Content-type?
- is there a blank newline between your headers and your output?
- did you restart Apache after setting the configuration?
If you did all that, it should work fine. I have this as my test.rb file:
#!/usr/bin/env ruby
puts <<EOS
Content-type: text/html
<html><body>hi</body></html>
EOS
I ran in to the same situation and was able to fix it by adding the following line after AddHandler
:
Require all granted
Double check that mod_cgi is enabled; the default Yosemite http.conf has it disabled.
To sum up all of the fine advice in these answers and your question itself (I had to do every single one of these things since I was starting from a blank slate):
httpd.conf
Set up the CGI directory with:
- The
+ExecCGI
option - Access control that allows the visitors you want (
Require all granted
, for example) - Set a handler for CGI scripts with
AddHandler
orSetHandler
(see note below)
Example:
<Directory /home/ceriak/ruby>
Options +ExecCGI
AddHandler cgi-script .rb
Require all granted
</Directory>
Note: to use CGI without having to use a specific file extension like .rb
, you can use SetHandler
instead:
SetHandler cgi-script
Now everything in the directory will be treated as a CGI script, which is likely what you want anyway and you can leave the extensions off, which may look nicer and/or not inform visitors of the underlying technology: http://example.com/test
Finally, check that mod_cgi
is enabled (where ${modpath}
is correct for your system):
LoadModule cgi_module ${modpath}/mod_cgi.so
Don't forget to restart Apache after making your changes. On Slackware, for example, we do this:
$ sudo /etc/rc.d/rc.httpd restart
The script
Don't forget the she-bang (#!
) to run the script with the Ruby interpreter.
Output a Content-type
, a newline, and then the body of your response:
#!/usr/bin/env ruby
puts "Content-type: text/html"
puts
puts "<html><body>Hello World!</body></html>"
Make sure the file is executable (by Apache!):
$ chmod +x /home/ceriak/ruby/test.rb
These two Apache documents are very helpful:
来源:https://stackoverflow.com/questions/2245634/setting-up-ruby-cgi-in-apache