2013-05-07 10 views
2

ASP.NET 개발 서버 (VS2012)는 LAN을 통해 URL에 액세스 할 수 없기 때문에 (!!) IIS를 구성 할 권한이 없으므로 WEBrick을 사용하여 정적 웹 사이트를 시작하고 LAN 액세스를 얻으려고합니다. 우분투는 Windows에서 방랑과 함께 운영되고 있습니다. 내 정적 웹 사이트의 루트에 Webrick 또는 Thin to run (non-ruby) 정적 웹 사이트

, 나는 다음과 같은 내용으로 파일 app.rb을 만들었습니다

#app.rb 

require 'rubygems' 
require 'rack' 

class App 
    def call(env) 
    return [200, {"Content-Type" => "text/html"}, "index.html"] 
    end 
end 

Rack::Handler::WEBrick.run(App.new, :Port => 8080) 

내가 서버를 실행하면, ruby app.rb이, 그리고 http://localhost:8080을 찾아, 그것은 나에게이 오류 제공 :에 WEBrick를 사용하는 방법이 있나요

ERROR NoMethodError: undefined method `each' for "index.html":String 
    /usr/local/rvm/gems/ruby-1.9.3-p392/gems/rack-1.4.5/lib/rack/handler/webrick.rb:71:in `service' 
    /usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service' 
    /usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run' 
    /usr/local/rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread' 

또는 정적 (HTML/JS) 웹 사이트를 실행하는 씬?

편집 나는 스튜어트의 제안을 따라에 코드를 변경 : 나는 URL을 탐색하고 때

return [200, {"Content-Type" => "text/html"}, ["index.html"]] 

지금, 대신 파일 내용을 렌더링 문자열로 "index.html을"렌더링합니다.

답변

2

serving a folder over HTTP with WEBrick하는 간단한 방법이있다.

그리고 Rack의 경우 자체적으로 파일 제공을 처리하지 않습니다. HTTP를 통해 제공 할 파일을 읽고 Rack에 파일의 내용을 제공해야합니다. 따라서이 빠르고 손쉬운 해결책을 시도해 볼 수 있습니다.

def call(env) 
    contents = File.open("index.html") { |f| f.read } 
    return [200, {"Content-Type" => "text/html"}, [contents]] 
end 
+0

@Annie가 원래 히트 한 것과 같은 이유 때문에 필자가 대답에서 설명했듯이 '내용'을 배열 (예 :'[contents]')로 묶어야합니다. 당신의 답을 그대로 풀려고했을 때 : NoMethodError : # 에 대한 정의되지 않은 메소드'each '가 있습니다. –

+0

@StuartM! – FilipK

+0

감사합니다. app.rb에 코드 블록을 붙여 넣은 다음 복사 한 코드를 복사했습니다. 동일한 경로를 따르는 사용자의 경우 고정 포트를 설정해야한다면'port = 12000 + (dir.hash % 1000)'을'port = your_port_number'로 바꾸고, 그렇지 않으면 12XXX 포트에서 서버를 시작합니다 코드에서 볼 수 있습니다). – Annie

1

귀하의 응답 본문은 배열에 싸여해야 다음 []"Hello, World!" 주변

return [200, {"Content-Type" => "text/html"}, ["Hello, World!"]] 

참고. 배열 래퍼가 필요한 이유에 대한 설명은 다음을 참조하십시오

Why is rack response body an array not a string?

그리고 특히 Python WSGI specification의이 섹션 :

For large files, however, or for specialized uses of HTTP streaming (such as multipart "server push"), an application may need to provide output in smaller blocks (e.g. to avoid loading a large file into memory). It's also sometimes the case that part of a response may be time-consuming to produce, but it would be useful to send ahead the portion of the response that precedes it.

In these cases, applications will usually return an iterator (often a generator-iterator) that produces the output in a block-by-block fashion. These blocks may be broken to coincide with mulitpart boundaries (for "server push"), or just before time-consuming tasks (such as reading another block of an on-disk file).

그 사양은 파이썬을 의미하지만, 루비 랙에 아날로그를 응용 프로그램은 배열 (또는 each 메서드에 응답하는 모든 Enumerable)에서 HTTP 응답 본문을 래핑합니다.

편집 : 당신이 할 수있는, 구체적으로 index.html 파일을 제공하는 방법에 대해, 원래의 질문의 편집 문제를 해결하기 위해 그 랙 응답 내용을 파일을 읽고 출력하여 :

return [200, {"Content-Type" => "text/html"}, [File.read("index.html")]] 

편집 2 : 위의 내용은 index.html 만 표시 할 수 있지만, 정적 리소스 (JS, CSS 등)의 전체 디렉토리를 제공하려면 Rack::Static 미들웨어를 사용해보십시오. 자세한 내용은 해당 설명서를 참조하십시오,하지만 난 당신이 달성 할 수있는 일을하려고하는지 생각 :

require 'rack/static' 
use Rack::Static, :urls => {"/" => 'index.html'} 
+0

감사의 말. 편집 된 질문을 확인하십시오.HTML 파일의 내용을 어떻게 렌더링 할 수 있습니까? – Annie

+0

나는 특별히 그 파일을 다루는 주소를 위의 내 대답을 편집했습니다 –

+0

고마워, 그것은 효과가! index.html의 내용이 표시됩니다. 그러나 이미지, JS 및 CSS 파일은 index.HTML과 동일한 내용 *으로로드됩니다! 어떤 아이디어, 요청 된 리소스를 전달하는 방법? – Annie