「/proxy/:someurl」に移動すると、フルページ iframe のような単純な Web プロキシである :someurl に直接移動する正確なコンテンツが表示される単純な Sinatra アプリを作成したいと考えています。
これを行う最善の方法は何ですか?
最も簡単なことは、たとえば RestClient を使用して次のように言うことです。
get '/proxy/:url' do |url|
RestClient.get(url)
end
これは、成功したフェッチのコンテンツをプロキシします。もう少し作業を行うと、コンテンツ タイプとキャッシュ制御ヘッダーを介してパイプ処理が行われます。もう少し、エラー コードを渡すことができます。次に、投稿します。それで...
とは言っても、Web サーバー プロキシを任意のコンテンツにするのはひどい考えなので、これ以上お手伝いするつもりはありません。これは、Web セキュリティの基礎である同一オリジン ポリシーを弱体化させます。遅い (別の Web サーバーを待っている Web サーバーを拘束する) および/または自明ではない ( sinatra-async
+を使用する場合em-http-request
)。それはあなたのウェブサーバーを完全に悪用を誘うアノニマイザーにします。ただ...しないでください。
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 に含まれるスラッシュや特殊文字が好きではありません。