Sinatra, CGI

先日 SinatraCGI で動かそうとしてエラー*1が発生したりして手こずっていた。が、やっとこさ動くようになったのでちょいまとめ。

やったこと

ディレクトリ構成
  • ロジックやテンプレ部分は DocumentRoot 下には置かない方針で。
/home/***/www/                        # => DocumentRoot
/home/***/www/test/index.cgi          # => ここにアクセス
/home/***/www/.htaccess               # => .htアクセス
/home/***/sites/test/test.rb          # => ロジック
/home/***/sites/test/views/index.haml # => HTMLテンプレ
/home/***/sites/test/views/test.sass  # => CSSテンプレ
/home/***/local/lib/ruby/gems/1.8/    # => GEM_HOME(gemは自分でinstall)
.htaccess の設定
DirectoryIndex index.cgi /index.html
AddHandler cgi-script .rb .cgi
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^test/(.*)$ test/index.cgi/$1 [L]
index.cgi
  • .htaccess に SetEnv で RUBYLIB や GEM_HOME の設定をしたが効果がなかったので、ソースに埋め込む
  • CGI で動かすときは :run => fale
  • chmod 0755
#! /usr/local/bin/ruby
$LOAD_PATH << '/home/***/local/lib'
ENV['GEM_HOME'] = '/home/***/local/lib/ruby/gems/1.8'

require 'rubygems'
require 'sinatra'

load '/home/***/sites/test/test.rb'

set :run => false, :environment => :cgi
Rack::Handler::CGI.run Sinatra::Application
test/test.rb
  • :views の設定
  • not_found で index にとばしたい場合は redirect '' ではなく、redirect '/test/'。よく考えれば当たり前。get '' do に合わせればよいのかと勘違いしていた。
require 'haml'
require 'sass'

set :views, File.dirname(__FILE__) + '/views'

get '/css/test.css' do
  content_type 'text/css', :charset => 'utf-8'
  sass :test
end

get '' do
  haml :index
end

not_found do
  redirect '/test/'
end

*1:環境が違うから初歩的なミスにも気がつかなかったんだよなー、と言い訳