【问题标题】:How can I use local resources on a server?如何在服务器上使用本地资源?
【发布时间】:2011-06-08 03:18:12
【问题描述】:

如何在使用 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 的事实。另一个是线程的使用好像不太对。有一个更好的方法吗?如果您认为这是正确的方法,请回答。

【问题讨论】:

  • 它是如何“不工作”的?你有错误吗?你得到什么了吗?你得到了什么?你期待什么?
  • 只是一个想法,但请检查文件的权限以确保服务器(而不仅仅是您)可以读取它。
  • @centipedefarmer 权限还可以。当我右键单击图片并执行“查看图片信息”时,我可以正确看到图片。
  • 我终于找到了一种方法。我将其添加为答案。

标签: ruby local absolute-path webrick


【解决方案1】:

一般来说,出于安全考虑,浏览器可能不会从互联网站点(使用 http:// 或 https:// 架构)链接到本地​​文件(使用 file:// 架构)。见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

【讨论】:

  • 感谢您的回答。我开始意识到安全问题。选择根目录只是一个例子。我想呈现一个页面,该页面具有指向本地计算机上某些目录的链接。我还想嵌入本地计算机中的图像,我以类似的方式尝试使用&lt;img href=...&gt;,但没有成功。
  • 您可以使用静态 HTML 页面执行此操作,您只需在浏览器中打开该页面。这不会遇到安全问题。或者,您需要通过 HTTP 服务器公开必要的文件/目录,并在没有 file:// 的情况下链接到它们
  • 我在我的问题中添加了一个工作代码,这可能会让我清楚我想要什么。如果你能帮助我,将不胜感激。
【解决方案2】:

试试这样的代码:

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

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

【讨论】:

  • 好的,我更新了一个似乎可行的响应。
  • 我用/path/to/file 作为/ 尝试了你的代码,但它不起作用。我做错了吗?
  • 我在我的问题中添加了一个工作代码,这可能会让我清楚我想要什么。如果你能帮助我,将不胜感激。
【解决方案3】:

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

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

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

官方声明见RFC 1738's specification 3.10 FILES for file: URLs

【讨论】:

  • 好吧,让我们忘记使用file: 打开。当我们访问服务器的index.html页面时,我们可以访问各种文件,如cssjspng。当主页是动态生成并使用 WEBrick 提供时,我们如何做到这一点?我想这应该是可能的。这是我想做的第二部分。
  • 我在我的问题中添加了一个工作代码,这可能会让我清楚我想要什么。如果你能帮助我,将不胜感激。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多