1

Webrick を使用して動的にレンダリングされたページ内でcssjs、などのローカル リソースを使用するにはどうすればよいですか? つまり、 Ruby on Rails のリンクpngなどはどのように機能するのでしょうか? これは最も基本的なことの 1 つであり、簡単な方法があるはずです。

考えられる解決策

次のように、2 つのサーブレットを使用して、やりたいことができました。

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一つには、本文で指定しなければならないという事実が好きではありません。もう1つは、スレッドの使用が正しくないようです。これを行うより良い方法はありますか?これが正しいと思うなら、そう答えてください。

4

4 に答える 4

2

一般的に言えば、セキュリティ上の懸念から、ブラウザーはインターネット サイト (http:// または https:// スキーマを使用) からローカル ファイル (file:// スキーマを使用) にリンクしない可能性があります。Google Chrome でローカル リンクを開くことはできますか?を参照してください。. これは、サーバー側のテクノロジーとは無関係です。

それ以外では、サーバーは完全に機能しているようです。へのリンクを含む HTML ページですべての要求に応答するように作成しました/。そのリンクをクリックすると、実際に何かが起こります。リクエストが送信され、同じページが再び表示されます。

HTTP経由でファイルシステム全体を公開したいようです。それがあなたが達成しようとしているものであれば、サーブレットをマウントしなくても簡単に逃げることができます:

server = WEBrick::HTTPServer.new(Port: 3000, BindAddress: "localhost", DocumentRoot: "/")
%w[INT TERM].each{|signal| trap(signal){server.shutdown}}
server.start
于 2011-06-08T10:27:33.103 に答える
1

提供されるWebページと、ブラウザによってドライブから直接開かれるページを混同しているようです。また、、、およびとはどのように異なりますfile:か。http:https:ftp:

file:ページがドライブから直接開かれるときにローカルで利用可能なリソースです。他のリソースは、ページがhttpdホストから提供されるときにリモートで利用可能なリソースです。

ブラウザは、サーバーからのページがドライブからのものであることを認識できません。どこかのサーバーから取得したことを知っているだけで、そのサーバーが同じハードウェア上にあるかどうかはわかりません。ブラウザは、リモートで取得されたページからローカルリソースにアクセスすることを許可しません。これは、数年前に閉鎖されたエクスプロイトでした。

公式ステートメントのURLについては、 RFC1738の仕様3.10FILESfile:を参照してください。

于 2011-06-08T16:36:12.530 に答える
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

これは私にとってはうまくいきます。理由はわかりませんが、リクエストオブジェクトで少なくとも1つのメソッドを呼び出すたびにうまくいくようです。

于 2011-06-08T03:22:27.580 に答える
0

ついに、単一のサーバーに複数のサーブレットをマウントできることがわかりました。そのような例を見つけるまでには長い時間がかかりました。

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/ものでもかまいません。リンクは期待されるディレクトリに正しくリダイレ​​クトされ、アクセス許可がないことを示します。これは、物事が正しく機能していることを示しています。今は許可の問題です。

于 2011-06-09T06:48:42.240 に答える