Как я могу использовать локальные ресурсы на сервере? - PullRequest
1 голос
/ 08 июня 2011

Как я могу использовать локальные ресурсы, такие как css, js, png и т. Д. В динамически отображаемой странице, используя webrick?Другими словами, как работают такие вещи, как Ruby on Rails, связывающие ?Я предполагаю, что это одна из самых основных вещей, и должен быть простой способ сделать это.

Возможное решение

Мне удалось сделать то, что я хотел, используядва сервлета следующим образом:

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 ]

2 голосов
/ 08 июня 2011

Вообще говоря, из соображений безопасности браузеры, скорее всего, не будут ссылаться на локальные файлы (используя схему file: //) с интернет-сайта (используя схему http: // или https: //). См. Может ли Google Chrome открывать локальные ссылки? . Это не связано с какой-либо технологией на стороне сервера.

Кроме того, кажется, что ваш сервер работает отлично. Вы сделали так, чтобы он отвечал на все запросы HTML-страницей, содержащей ссылку на /. Когда вы нажимаете на эту ссылку, что-то действительно происходит; запрос отправлен, и вам снова предоставляется та же страница.

Звучит так, будто вы хотите раскрыть всю свою файловую систему через HTTP. Если это то, чего вы пытаетесь достичь, вы можете просто обойтись без монтирования сервлета:

server = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "localhost", DocumentRoot: "/")
%w[INT TERM].each{|signal| trap(signal){server.shutdown}}
server.start
1 голос
/ 08 июня 2011

Похоже, вы путаете веб-страницы, которые обслуживаются, со страницами, которые открываются браузером непосредственно с вашего диска, и чем file: отличается от http:, https: и ftp:.

file: - это локально доступный ресурс, когда страница открывается непосредственно с диска.Другие являются удаленно доступными ресурсами, когда страница обслуживается с хоста httpd.

Браузер не может определить, что страница с сервера пришла с вашего диска;Он только знает, что получил его с сервера, где-то, и не знает или не заботится, находится ли этот сервер на том же оборудовании.Браузеры не разрешают доступ к локальным ресурсам с удаленно извлекаемых страниц.Это был эксплойт, который был закрыт несколько лет назад.

См. Спецификация RFC 1738 3.10 ФАЙЛЫ для file: URL-адресов для официальных заявлений.

1 голос
/ 08 июня 2011

Попробуйте код, подобный этому:

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

Это работает для меня, я не уверен, почему, но, похоже, это работает, когда я вызываю хотя бы один метод для объекта запроса.

0 голосов
/ 09 июня 2011

Я наконец узнал, что могу монтировать несколько сервлетов на одном сервере. Прошло много времени, пока я не нашел такой пример .

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/ может быть любым другим. Теперь ссылка будет правильно перенаправлять на ожидаемый каталог, показывая, что нет прав доступа, что указывает на то, что все работает правильно; теперь это просто вопрос разрешения.

...