我想制作一个简单的 Sinatra 应用程序,当我导航到“/proxy/:someurl”时,我将看到直接导航到 :someurl 的确切内容,也就是一个简单的网络代理,有点像整页 iframe。
做这个的最好方式是什么?
最简单的事情是使用例如 RestClient 并说:
get '/proxy/:url' do |url|
RestClient.get(url)
end
这将代理任何成功获取的内容。做更多的工作,您将通过内容类型和缓存控制标头进行管道传输。再多一点,你就可以通过错误代码了。然后发布。然后...
也就是说,我不会进一步帮助您,因为让您的 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 中的斜杠和特殊字符。