我想製作一個簡單的Sinatra應用程序,當我導航到「/ proxy /:someurl」時,我會看到直接導航到:someurl的確切內容,也就是一個簡單的web代理,有點像整頁iframe。如何在Sinatra中創建代理?
這樣做的最好方法是什麼?
我想製作一個簡單的Sinatra應用程序,當我導航到「/ proxy /:someurl」時,我會看到直接導航到:someurl的確切內容,也就是一個簡單的web代理,有點像整頁iframe。如何在Sinatra中創建代理?
這樣做的最好方法是什麼?
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中使用的斜槓和特殊字符。
最簡單的事情是使用例如RestClient並說:
get '/proxy/:url' do |url|
RestClient.get(url)
end
這將代理任何成功的提取內容。做更多的工作,並且通過內容類型和緩存控制標題。多一點,你可以通過錯誤代碼。然後POST。然後...
這就是說,我不打算進一步幫助你,因爲讓你的web服務器代理任意內容是一個可怕的想法。它破壞了作爲網絡安全基礎的same origin policy。它很慢(捆綁您的Web服務器等待另一個Web服務器)和/或不平凡(如果你去與sinatra-async
+ em-http-request
)。它使您的Web服務器成爲匿名者,完全引發濫用。只是...不。
雖然有效,但腳本和樣式表不起作用。你有沒有試過這個代碼? –
其實它有時(如yahoo.com),但不是其他人(如與habosa.com),有任何想法,爲什麼這是嗎? 順便說一下,它有更多的工作,而不是那些沒有。 –
使用'open-uri'會導致這個實現不僅代理HTTP內容,而且代理本地文件:'GET/proxy?url =/etc/passwd'。玩的開心! – willglynn