Как я могу использовать локальные ресурсы на сервере?

Как я могу использовать местные ресурсы, такие как 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 ответа

Решение

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

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

Вообще говоря, из соображений безопасности браузеры, скорее всего, не будут ссылаться на локальные файлы (используя схему 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

Попробуйте код так:

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

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

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

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

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

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

Другие вопросы по тегам