Created
February 18, 2012 16:44
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<% header "Content-Type" => "text/html" %> | |
<h1>Let's run some ruby code: <%= rand %></h1> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Using ruby 1.9.3 and Apache 2.2.20. Two changes to the cgi script:
.html.erb
, then you don't need to callheader
in your erb; theContent-Type: text/html
header is added by Apache. If not, it will betext/plain
.$CGI.path_translated
(the full path to the requested erb file) instead ofARGV[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, andruby-cgi.rb
must be executable.