1

如何在使用 webrick 的动态呈现页面中使用本地资源,如cssjs、等?png换句话说,Ruby on Rails 链接之类的东西是如何工作的?我想这是最基本的事情之一,应该有一个简单的方法来做到这一点。

可能的解决方案

我设法使用以下两个 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

4 回答 4

2

一般来说,出于安全考虑,浏览器可能不会从 Internet 站点(使用 http:// 或 https:// 模式)链接到本地​​文件(使用 file:// 模式)。请参阅Google Chrome 能否打开本地链接?. 这与任何服务器端技术无关。

除此之外,您的服务器似乎运行良好。您已经做到了,它使用包含指向/. 当您单击该链接时,确实会发生某些事情;发送一个请求,您将再次获得相同的页面。

听起来您想通过 HTTP 公开整个文件系统。如果这是您要完成的任务,则可以不安装 servlet 就可以逃脱:

server = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "localhost", DocumentRoot: "/")
%w[INT TERM].each{|signal| trap(signal){server.shutdown}}
server.start
于 2011-06-08T10:27:33.103 回答
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

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

于 2011-06-08T03:22:27.580 回答
1

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

file:是直接从驱动器打开页面时本地可用的资源。当从 httpd 主机提供页面时,其他资源是远程可用的资源。

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

有关官方声明的URL ,请参阅RFC 1738 的规范 3.10 文件。file:

于 2011-06-08T16:36:12.530 回答
0

我终于发现我可以在单个服务器上挂载多个 servlet。我花了很长时间才找到这样的例子

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/可以是其他任何东西。该链接现在将正确重定向到预期的目录,显示没有访问权限,这表明一切正常;现在只是许可问题。

于 2011-06-09T06:48:42.240 回答