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 でアクセスする、というような感じのプロセスにしたいんだけど、やっぱ無理かな><
追記(2009/7/28)
パスの差異に関する設定は解決ができた。
sinatra での SubURI アクセスで、静的コンテンツにリンクする方法 - @sugamasao.blog.title # => ”コードで世界を変えたい”
*1:ずれが生じるのは当たり前なんだけどさ