如何在Sinatra代理?

时间:2012-09-21 21:22:01

标签: html ruby proxy sinatra

我想创建一个简单的Sinatra应用程序,当我导航到“/ proxy /:someurl”时,我会看到直接导航的确切内容:someurl,AKA是一个简单的Web代理,有点像整页iframe 。

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

最简单的方法是使用例如RestClient并说:

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

代表任何成功获取的内容。做一些工作,你正在管理内容类型和缓存控制标头。多一点,你可以通过错误代码。然后POST。然后...

那就是说,我不打算再帮助你,因为让你的网络服务器代理任意内容是一个糟糕的主意。它破坏了same origin policy,这是网络安全的基础。它很慢(占用您的Web服务器等待另一个Web服务器)和/或不平凡(如果您使用sinatra-async + em-http-request)。它使您的Web服务器成为完全邀请滥用的匿名者。只是......不要。

  • 代理任意网址:错误
  • 从您信任的特定网址中搜索某些内容:可能没问题,但仍可能不是最佳解决方案。

答案 1 :(得分: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中的斜杠和特殊字符。