2017-06-16 76 views
4

Snip.ly很好地检查输入的Web地址是否可以在iframe中使用。 我想用红宝石复制它。查看他们的代码,他们发送一个ajax请求到他们的服务器,并在那里他们进行验证。检查url是否可以在iframe中加载

即使广泛的谷歌搜索无法找到任何可以帮助我完成的任务。

我使用的情况是,我们让用户添加新闻列表到他们的页面,这是iframe中显示,想显示它如果输入的网址可以在iframe中使用。

+0

如果该页面包含一个JS代码,确定它是否是一个iframe中,并根据结果,以触发AJAX请求服务器 ? – yeyo

+0

@yeyo我并没有完全得到你的意思 – Alfie

+0

很多事情像Adblock的,防火墙等,可以阻止加载URL。我认为你可以在后端做的最好的事情是向请求的url发送请求,检查是否有任何响应,并检查'X-Frame-Options'响应头。它可以阻止将响应加载到iframe中。 –

回答

0

您可以通过检查X-Frame-Options标题来找出某些情况。但正如你在评论中提到的那样,它并不是一直工作的。

根据我的经验,最好完全侧重解决问题。 如果您通过您的Rails服务器反向代理您的请求,那么您可以在iframe中始终显示任何内容。

以下是该过程的一个示例。我假设你的服务器是your-server.com,并且用户想要在user.com/list上列出一个页面。它的工作方式是:

  1. 设置一个iframe的src到https://your-server.com/proxy?url=https://user.com/list`
  2. 拦截请求,提取网址:https://user.com/list
  3. https://user.com/list执行HTTP请求到内容获取
  4. 返回它到浏览器就好像它来自你自己的服务器

这种方法几乎一直工作,但它有其他限制: - 您应该反向代理该网页上具有相对网址的任何资产;否则的CSS /图像可能被打破 - 你必须在该网页上处理Ajax请求

您可以修复这些中,通过将HTML步骤4 之前,你可以使用https://github.com/waterlink/rack-reverse-proxy步骤2和3,而不是重新实施您自己的反向代理。

你可以把它架在config/application.rb使用下面的代码:

config.middleware.insert(0, Rack::ReverseProxy) do 
    reverse_proxy_options timeout: 10 # avoids waiting for pages that take forever to load 
    reverse_proxy(/proxy\?url=(.*)/, '$1') # reverse proxy on the url parameter 
end