0

「/proxy/:someurl」に移動すると、フルページ iframe のような単純な Web プロキシである :someurl に直接移動する正確なコンテンツが表示される単純な Sinatra アプリを作成したいと考えています。

これを行う最善の方法は何ですか?

4

2 に答える 2

5

最も簡単なことは、たとえば RestClient を使用して次のように言うことです。

get '/proxy/:url' do |url|
  RestClient.get(url)
end

これは、成功したフェッチのコンテンツをプロキシします。もう少し作業を行うと、コンテンツ タイプとキャッシュ制御ヘッダーを介してパイプ処理が行われます。もう少し、エラー コードを渡すことができます。次に、投稿します。それで...

とは言っても、Web サーバー プロキシを任意のコンテンツにするのはひどい考えなので、これ以上お手伝いするつもりはありません。これは、Web セキュリティの基礎である同一オリジン ポリシーを弱体化させます。遅い (別の Web サーバーを待っている Web サーバーを拘束する) および/または自明ではない ( sinatra-async+を使用する場合em-http-request)。それはあなたのウェブサーバーを完全に悪用を誘うアノニマイザーにします。ただ...しないでください。

  • 任意の URL のプロキシ:悪い
  • 信頼できる特定の URL から一部のコンテンツをプロキシする: おそらく問題ありませんが、最善の解決策ではありません。
于 2012-09-21T22:42:13.473 に答える
2
require 'sinatra'
require 'open-uri'

get '/proxy' do
  url = params[:url]
  raise "GTFO" if (url[0] == '/' || url[0] == '.')
  open(url) do |content|
    content.read.to_s.gsub(/(href|src)=("|')\//, '\1=\2' + url + '/')
  end
end

このスクリプトは、 OpenURIのおかげでページのコンテンツを取得し、スクリプト、スタイルシート、画像リンクを修正してから、結果を表示します。

/proxy?url=http://url.com/ルートの代わりにルートを使用しました/proxy/url。Sinatra は、通常 URL に含まれるスラッシュや特殊文字が好きではありません。

于 2012-09-21T22:51:08.063 に答える