public
Last active — forked from joshhepworth/httpd.conf

Running Ruby under Apache like PHP, using cgi - http://stackoverflow.com/a/1901772/231245

  • Download Gist
example.erb
HTML+ERB
1 2
<% header "Content-Type" => "text/html" %>
<h1>Let's run some ruby code: <%= rand %></h1>
httpd.conf
ApacheConf
1 2 3 4 5 6 7 8 9 10 11
# A section of your Apache config (or .htaccess)
# Credit to dvyjones
 
LoadModule cgi_module modules/mod_cgi.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
 
Action application/x-httpd-erb /cgi-bin/ruby-cgi.rb
AddHandler application/x-httpd-erb .erb
ScriptAlias /cgi-bin/ /path/to/your/cgi-bin/
DirectoryIndex index.erb index.html
ruby-cgi.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#!/usr/bin/env ruby
 
# Copyright (c) 2011 Henrik Hodne
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# Except as contained in this notice, the name(s) of the above
# copyright holders shall not be used in advertising or otherwise
# to promote the sale, use or other dealings in this Software
# without prior written authorization.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
 
require 'cgi'
require 'erb'
 
$CGI = CGI.new
include ERB::Util
 
# Use this to output a header. This will output the header immediately,
# and ensures that it's printed before the other content
# This accepts either string(s) or a hash
# To force html content type, in your erb you must specify:
# <% header "Content-Type" => "text/html" %>
# or
# name the filewith extension .html.erb
def header(*args)
if args.length == 1
args.first.each do |key, value|
puts "#{key}: #{value}\r\n"
end
else
args.each {|s| puts s+"\r\n" }
end
($HEADERS ||= []).push(*args)
end
 
bind = binding # To prevent the erb script to have access to "f"
 
puts "\r\n" + File.open($CGI.path_translated, "r") { |f| ERB.new(f.read).result(bind) }

Using ruby 1.9.3 and Apache 2.2.20. Two changes to the cgi script:

  • Always output a blank line after headers and before rendering content. If the erb file is named .html.erb, then you don't need to call header in your erb; the Content-Type: text/html header is added by Apache. If not, it will be text/plain.
  • Read file $CGI.path_translated (the full path to the requested erb file) instead of ARGV[0}.

The required Apache modules are cgi, actions, and alias. All .erb files are processed by the cgi script, which then uses the originally requested erb file as the template. /cgi-bin must be accessible in the www directory, and ruby-cgi.rb must be executable.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.