如何使用webrick在动态呈现的页面中使用css
,js
,png
等本地资源?换句话说,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
的事实。另一种是使用线程似乎不对。有一个更好的方法吗?如果您认为这是正确的方法,请回答。
答案 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/
可以是其他任何东西。该链接现在将正确地重定向到预期的目录,表明没有访问权限,这表明事情正常;现在只是一个许可问题。