如何在服务器上使用本地资源?

时间:2011-06-08 03:18:12

标签: ruby local absolute-path webrick

如何使用webrick在动态呈现的页面中使用cssjspng等本地资源?换句话说,Ruby on Rails linking之类的东西是如何起作用的?我想这是最基本的事情之一,应该有一个简单的方法。

可能的解决方案

我设法按照以下方式使用两个servlet执行我想要的操作:

require 'webrick' 

class WEBrick::HTTPServlet::AbstractServlet
  def do_GET request, response
    response.body = '<html>
      <head><base href="http://localhost:2000"/></head>
      <body><img src="path/image.png" /></body>
    </html>'
  end
end

s1 = WEBrick::HTTPServer.new(Port: 2000, BindAddress: "localhost")
s2 = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "localhost")
%w[INT TERM].each{|signal| trap(signal){s1.stop}}
%w[INT TERM].each{|signal| trap(signal){s2.shutdown}}
s1.mount("/", WEBrick::HTTPServlet::FileHandler, '/')
s2.mount("/", WEBrick::HTTPServlet::AbstractServlet)

Thread.new{s1.start}
s2.start

这是正确的方法吗?我不这么认为。另外,我对它并不完全满意。首先,我不喜欢我必须在正文中指定http://localhost:2000的事实。另一种是使用线程似乎不对。有一个更好的方法吗?如果您认为这是正确的方法,请回答。

4 个答案:

答案 0 :(得分:2)

一般来说,由于安全问题,浏览器可能无法从Internet站点(使用http://或https:// schema)链接到本地​​文件(使用file:// schema)。见Can Google Chrome open local links?。这与任何服务器端技术无关。

除此之外,您的服务器似乎运行正常。你已经做到了这一点,所以它通过一个包含/链接的HTML页面来响应所有请求。当您点击该链接时,确实会发生一些事情;我们会发送一个请求,并再次为您提供同一页面。

听起来您希望通过HTTP公开整个文件系统。如果这是你想要完成的事情,你可以简单地避免安装servlet:

server = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "localhost", DocumentRoot: "/")
%w[INT TERM].each{|signal| trap(signal){server.shutdown}}
server.start

答案 1 :(得分:1)

尝试这样的代码:

require 'webrick'

class WEBrick::HTTPServlet::AbstractServlet
  def do_GET request, response
    if request.unparsed_uri == "/"
      response.body = '<html><body><a href = "/path/to/file">test</a></body></html>'
    end
  end
end

server = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "localhost", DocumentRoot: "/")
%w[INT TERM].each { |signal| trap(signal) { server.shutdown } }
server.mount("/", WEBrick::HTTPServlet::AbstractServlet)
server.start

这对我有用,我不知道为什么,但只要我在请求对象上调用至少一个方法,它似乎就可以工作。

答案 2 :(得分:1)

听起来您提供的网页与浏览器直接从您的驱动器打开的网页相混淆,以及file:http:https:的区别,以及ftp:

从驱动器直接打开页面时,

file:是本地可用的资源。当从httpd主机提供页面时,其他是远程可用资源。

浏览器无法判断来自服务器的页面来自您的驱动器;它只知道从某个服务器获取它,并且不知道或不关心该服务器是否在同一硬件上。浏览器不允许从远程检索的页面访问本地资源。这是几年前关闭的漏洞。

有关官方声明,请参阅RFC 1738's specification 3.10 FILES for file: URLs

答案 3 :(得分:0)

我终于发现我可以在一台服务器上安装多个servlet。我花了很长时间才发现such example

require 'webrick' 

class WEBrick::HTTPServlet::AbstractServlet
  def do_GET request, response
    response.body = '<html>
      <head><base href="/resource/"/></head>
      <body>
        <img src="path_to_image/image.png";alt="picture"/>
        <a href="path_to_directory/" />link</a>
        ...
      </body>
    </html>'
  end
end

server = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "localhost")
%w[INT TERM].each{|signal| trap(signal){server.shutdown}}
server.mount("/resource/", WEBrick::HTTPServlet::FileHandler, '/')
server.mount("/", WEBrick::HTTPServlet::AbstractServlet)
server.start

路径/resource/可以是其他任何东西。该链接现在将正确地重定向到预期的目录,表明没有访问权限,这表明事情正常;现在只是一个许可问题。