检查 url 是否可以加载到 iframe 中

Alf*_*fie 5 ruby iframe ruby-on-rails

Snip.ly 很好地检查输入的网址是否可以在 iframe 中使用。我想用红宝石复制它。查看他们的代码,他们向服务器发送 ajax 请求,这就是他们进行验证的地方。

即使经过广泛的谷歌搜索也找不到任何可以帮助我实现这一目标的东西。

我的用例是,我们让用户将新闻列表添加到他们的页面,这些新闻列表显示在 iframe 中,并且希望显示输入的 url 是否可以在 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. 拦截请求,提取url:https://user.com/list
  3. 执行 HTTP 请求以https://user.com/list获取内容
  4. 将其返回给浏览器,就好像它来自您自己的服务器一样

这种方法几乎一直有效,但它还有其他限制: - 您应该反向代理该页面上具有相对 url 的任何资产;否则 css/图像可能会损坏 - 您必须处理该页面上的 ajax 请求

您也可以通过在步骤 4 之前转换 html 来修复这些问题。您可以在步骤 2 和 3 中使用https://github.com/waterlink/rack-reverse-proxy,而不是重新实现您自己的反向代理。

您可以使用以下代码进行设置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
Run Code Online (Sandbox Code Playgroud)