0

我想制作一个简单的 Sinatra 应用程序,当我导航到“/proxy/:someurl”时,我将看到直接导航到 :someurl 的确切内容,也就是一个简单的网络代理,有点像整页 iframe。

做这个的最好方式是什么?

4

2 回答 2

5

最简单的事情是使用例如 RestClient 并说:

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

这将代理任何成功获取的内容。做更多的工作,您将通过内容类型和缓存控制标头进行管道传输。再多一点,你就可以通过错误代码了。然后发布。然后...

也就是说,我不会进一步帮助您,因为让您的 Web 服务器代理任意内容是一个糟糕的主意。它破坏了作为网络安全基础的同源策略。它很慢(占用您的 Web 服务器等待另一个 Web 服务器)和/或不平凡(如果您使用sinatra-async+ em-http-request)。它使您的网络服务器成为一个匿名器,完全会引起滥用。只是……不要。

  • 代理任意 URL:bad
  • 从您信任的特定 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 回答