我想创建一个简单的Sinatra应用程序,当我导航到“/ proxy /:someurl”时,我会看到直接导航的确切内容:someurl,AKA是一个简单的Web代理,有点像整页iframe 。
这样做的最佳方式是什么?
答案 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中的斜杠和特殊字符。