すがブロ

sugamasaoのhatenablogだよ

sinatra アプリを Passenger で「Sub URI」で動かす(2)

sinatra アプリの PATH_INFO はどうなってんの?

sinatra アプリを Passenger で「Sub URI」で動かす - @sugamasao.blog.title # => ”コードで世界を変えたい”の続き。
元々書こうとは思っていたのですが、ブコメでも言及された件について

# b:id:Sixeight これで動いているんだろうか、path_infoがずれるから小細工が必要なきが(僕の設定が間違ってるのかな) 2009/06/15

簡単に言ってしまえば、Sub URI 設定をして http://example.com/sinatra_app/ にアクセスした場合の挙動についてです。

require 'rubygems'
require 'sinatra'

get '/' do
  request.env['PATH_INFO']
end

こうした場合にアクセスできるのか? また、アクセスした場合、 PATH_INFO はどのようになるのか? という点。

結論から言うと

http://example.com/sinatra_app/ = sinatra アプリの '/' 相当になる。
上記のスクリプトを実行すると、こんな感じ

ちょっとわかりにくいけれど、 '/' が出力されている。
つまり、Sub URI 設定にしていても、ruby sinatra_app.rb で実行していたときと同様にアクセスを処理できる。

ただし

sinatra は問題無いのだけど、haml の設定には少し気をつけてあげる必要がある。
画像にせよ、CSS にせよ、リンクを /img/hoge.jpg のようなリンクがある場合、それは当然だけど http://example.com/img/hoge.jpg 相当になる。
なので、sinatra内での PATH_INFO とはズレてしまう。
sass で生成する css については、以下のようにして無理くり sinatra アプリ内で受け取れるようにした。

get "*sass_style.css" do
  content_type 'text/css', :charset => 'utf-8'
  sass :sass_style, :sass_options => {:style => :expanded } # overridden
end

でも、静的ファイルに関しては Sub URI の時と、Document Root の時で同じようにパスを取り扱う方法がわからなかった*1
できれば開発時は ruby sinatra_app.rb で直接起動させて動作確認をして、サーバにデプロイすると Sub URI でアクセスする、というような感じのプロセスにしたいんだけど、やっぱ無理かな><

*1:ずれが生じるのは当たり前なんだけどさ