2012-01-10 11 views
4

静的ファイルと動的コンテンツをRackを通じて処理したい。動的なコンテンツで応答されますlocalhost:3000に要求し、localhost:3000/resource/path_to_fileへの要求がで応答されます、ラックの静的ファイルをマウントする方法

@s = WEBrick::HTTPServer.new(
     Port: 3000, 
     BindAddress: "localhost", 
     Logger: WEBrick::Log.new(File::NULL), 
     AccessLog: [nil, nil] 
    ) 
    %w[INT TERM].each{|signal| trap(signal){@s.shutdown}} 
    @s.mount("/", self) 
    @s.mount("/resource/", WEBrick::HTTPServlet::FileHandler, "/") 
    @s.start 

を上記において:以前、私はこのようなコードで、ラックを使用せずにWEBrickにを使用し、それが働きました私のコンピュータの/path_to_fileにある静的ファイル。

ここでは、Thinサーバーを搭載したRackを使用するシステムに切り替える必要があります。私は次のように書いていますが、静的ファイルを取得できませんでした。それを動作させるには、どのように変更する必要がありますか?

Rack::Handler::Thin.run(->env{ 
     h = Rack::Utils.parse_nested_query(env["QUERY_STRING"]) 
     # I tried the following three lines one at a time, but neither worked. 
     use(Rack::Static, urls: "/resource/", root: "/") # First try 
     Rack::File.new("/resource").call(env) # Second try 
     Rack::Directory.new("/resource").call(env) # Third try 
     [200, {}, [some_dyamically_generated_content]] 
    }, Port: 3000) 

私はTHERが同様の問題であることを知っている:How to serve static files via Rack?が、私はそれを動作させることができませんでした。 Rack::StaticRack::File、またはRack::Directoryの使用方法がわかりません。教えて下さい。

答えて

6

から静的ファイルにアクセスすることができますRack::Builder通常のRubyスクリプト(通常はconfig.ruファイルで使用されています)でuse SomeMiddlewareの構文を使用するには、また、アプリケーションにはrunが必要です。 Rack::Staticからurlsキーが配列ではなく、単一の文字列を取ることに注意してください:

require 'rack' 
Rack::Handler::Thin.run(Rack::Builder.new { 
    use(Rack::Static, urls: ["/resource/"], root: "/") 
    run ->env{[200, {}, [some_dyamically_generated_content]]} 
}, Port: 3000) 

ここRack::Builder、あなたのアプリケーションを取って->env{[200, {}, [some_dyamically_generated_content]]}、それにRack::Staticミドルウェアを追加し、シンに渡される新しい複合アプリケーションを作成しています走る。

Rack::Staticは、既存のラックアプリケーションに追加できるミドルウェアコンポーネントです。 Rack::FileRack::Directoryはどちらもミドルウェアではなく、両方ともラックアプリケーションです(Rack::Staticは内部でRack::Fileを使用し、デフォルトでRack::Directoryとなります)。

require 'rack' 
Rack::Handler::Thin.run(Rack::Builder.new { 
    map "/resource/" do 
     run Rack::File.new "/" 
    end 
    map "/" do 
     run ->env{[200, {}, [some_dyamically_generated_content]]} 
    end 
}, Port: 3000) 

config.ruファイルにRack::Bundler.newに渡されたブロックの内容を置くことになり、これを行うために、より一般的な方法:

use(Rack::Static, urls: ["/resource/"], root: "/") 
run ->env{[200, {}, [some_dyamically_generated_content]]} 
Rack::Filemapコマンドを使用して上記のようにして、同じ効果を得ることができ

thin startでこれを実行できます。同じディレクトリから実行する場合はconfig.ruとなります。または-Rオプションを使用してファイルを指定できます。 Thinをサーバーとして指定する場合は、rackupコマンドを使用して、rackup -s thinを使用することもできます。

+0

書き直しと詳細をありがとう。出来た。 – sawa

1

ファイルを提供する前に認証/承認を必要としない場合は、ファイルを/publicに追加し、それらのファイルを基盤となるサーバーで処理できるようにする必要があります。 だから、あなたは(薄い、WEBrickにを使用して、またはApacheまたは任意の基礎となるサーバー)にアプリを起動したら、アプリのレイアウトはすべて、この

my_app/ 
    - app.rb 
    - config.ru 
    - public/ 
    - a_static_file.png 
    - another_static_file.png 

のように見える場合は、あなたが使用する必要がhttp://localhost:4567/a_static_file.png

+0

私はそれを見るかもしれませんが、今は特定の場所にアクセスする必要がありますが、すべてを '/ public'に移動させる必要はありません。助けてくれてありがとう。 – sawa

関連する問題