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