2012-01-10 2 views
4

랙을 통해 정적 컨텐츠 파일과 동적 컨텐츠를 서비스하고자합니다. 동적 내용으로 응답 될 것이다 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) 

저는 비슷한 질문입니다 : How to serve static files via Rack?,하지만 나는 그것을 작동시킬 수 없습니다. Rack::Static, Rack::File 또는 Rack::Directory을 사용하는 방법을 잘 모르겠습니다. 가르쳐주세요.

답변

6

에서 정적 파일에 액세스 할 수 있습니다 (기본 어떤 서버 얇고에 WEBrick, 또는 아파치 또는 사용) 응용 프로그램을 시작하면이

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

처럼 보이는 경우 Rack::Builder 정상적인 Ruby 스크립트 (보통 config.ru 파일에서 사용됨)에서 구문을 사용하려면 또한 신청서에 run이 필요합니다. 여기 Rack::Builder

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::Static 미들웨어를 추가, 응용 프로그램, ->env{[200, {}, [some_dyamically_generated_content]]}을 복용 한 후 씬에 전달되는 새로운 결합 된 응용 프로그램을 만드는 : Rack::Staticurls 키가 배열이 아닌 하나의 문자열을 사용합니다 달리기.

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에 파일을 추가하고 기본 서버에서 파일을 제공 할 수 있어야합니다. 그래서 앱 레이아웃은 당신이 당신은 사용할 필요가 http://localhost:4567/a_static_file.png

+0

그걸 살펴볼 수는 있지만 지금은 '/ public'으로 이동하지 않고 특정 위치에 대한 액세스가 필요합니다. 도와 주셔서 감사합니다. – sawa

관련 문제