Sinatra, CGI
先日 Sinatra を CGI で動かそうとしてエラー*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:環境が違うから初歩的なミスにも気がつかなかったんだよなー、と言い訳