Skip to content

Instantly share code, notes, and snippets.

@jjulian
Created February 18, 2012 16:44
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save jjulian/1860123 to your computer and use it in GitHub Desktop.
Save jjulian/1860123 to your computer and use it in GitHub Desktop.
Running Ruby under Apache like PHP, using cgi - http://stackoverflow.com/a/1901772/231245
<% header "Content-Type" => "text/html" %>
<h1>Let's run some ruby code: <%= rand %></h1>
# 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
#!/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) }
@jjulian
Copy link
Author

jjulian commented Feb 18, 2012

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.

@lawre
Copy link

lawre commented Jul 1, 2016

how would i pass parameters? i.e. http://example.com/foo.erb?param1=value1&param2=value2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment