2012-09-21 82 views
0

我想製作一個簡單的Sinatra應用程序,當我導航到「/ proxy /:someurl」時,我會看到直接導航到:someurl的確切內容,也就是一個簡單的web代理,有點像整頁iframe。如何在Sinatra中創建代理?

這樣做的最好方法是什麼?

回答

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中使用的斜槓和特殊字符。

+0

雖然有效,但腳本和樣式表不起作用。你有沒有試過這個代碼? –

+0

其實它有時(如yahoo.com),但不是其他人(如與habosa.com),有任何想法,爲什麼這是嗎? 順便說一下,它有更多的工作,而不是那些沒有。 –

+4

使用'open-uri'會導致這個實現不僅代理HTTP內容,而且代理本地文件:'GET/proxy?url =/etc/passwd'。玩的開心! – willglynn

4

最簡單的事情是使用例如RestClient並說:

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

這將代理任何成功的提取內容。做更多的工作,並且通過內容類型和緩存控制標題。多一點,你可以通過錯誤代碼。然後POST。然後...

這就是說,我不打算進一步幫助你,因爲讓你的web服務器代理任意內容是一個可怕的想法。它破壞了作爲網絡安全基礎的same origin policy。它很慢(捆綁您的Web服務器等待另一個Web服務器)和/或不平凡(如果你去與sinatra-async + em-http-request)。它使您的Web服務器成爲匿名者,完全引發濫用。只是...不。

  • 代理任意URL:不好
  • 代理您信任的特定網址中的某些內容:可能是可以的,但仍可能不是最佳解決方案。