Приложение Ruby on rails 4 не работает в iframe

Как я могу встроить свое приложение rails в другой веб-сайт через iframe?

Это хорошо работает с RoR 3, но не с RoR 4:

<iframe src="http://myrailsapp.com/" width="100%" height="50" id="rails_iframe">error!</iframe>

Я пытался использовать параметры verify_authenticity_token и protect_from_forgery в своем контроллере... кажется, это что-то другое (но я не уверен).

обновление Пример: http://jsfiddle.net/zP329/


person Oleg Pasko    schedule 15.05.2013    source источник
comment
Почему iframe? Определенно ли нет лучшего варианта, например. использовать встроенный виджет JS для доступа к данным вашего сайта через AJAX?   -  person Matt Gibson    schedule 17.05.2013
comment
Для меня коллега загружал мое приложение на свою личную HTML-страницу IFrame, которая загружала несколько его ежедневных сайтов и инструментов. Ответ jcypret был тем, что мне было нужно   -  person Matthew Clark    schedule 03.12.2013


Ответы (4)


Это связано с включением в Rails 4 дополнительных протоколов безопасности по умолчанию: http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/

Настройкой, которая ломает iFrames на удаленных сайтах, является X-Frame-Options. По умолчанию установлено значение SAMEORIGIN, что предотвращает загрузку содержимого из другого домена:

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'SAMEORIGIN'
}

Вы можете прочитать о новых заголовках по умолчанию здесь: http://edgeguides.rubyonrails.org/security.html#default-headers

Чтобы позволить iFrame работать между доменами, вы можете изменить заголовки по умолчанию, чтобы разрешить X-Frame между доменами.

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'ALLOWALL'
}
person jcypret    schedule 18.05.2013
comment
После изменения конфигурации ваш браузер может по-прежнему кэшировать старые заголовки. Вы можете убедиться, что это не так, открыв iframe в режиме инкогнито/приватном окне. - person georgelx; 11.10.2013
comment
ALLOWALL не указан в качестве опции для X-Frame-Options: developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options . нельзя ли убрать шапку? - person Cristian; 04.11.2013
comment
Я также должен упомянуть, что хром будет кэшировать старое значение, поэтому вам нужно будет отключить кеш хрома в процессе разработки. - person JZ.; 24.12.2013
comment
Использование пустой строки вместо ALLOWALL работает в Chromium и Firefox. - person Fabrizio Regini; 20.01.2014
comment
Это все еще в силе? ipsec.pl/web-application-security/ 2013/ - person Ernest; 29.09.2014

Rails 4 добавлено значение X-Frame-Options заголовка HTTP по умолчанию SAMEORIGIN . Это хорошо для безопасности, но когда вы делаете хотите, чтобы ваш action вызывался в iframe, вы можете сделать это:


Чтобы разрешить все источники:

class MyController < ApplicationController
  def iframe_action
    response.headers.delete "X-Frame-Options"
    render_something
  end
end


Чтобы разрешить конкретное происхождение:

class MyController < ApplicationController
  def iframe_action
    response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-origin.com"
    render_something
  end
end


Используйте: after_filter

Когда вам нужно использовать более одного из ваших action в iframe, хорошей идеей будет создать метод и вызвать его с помощью :after_filter:

class ApplicationController < ActionController::Base

  private
  def allow_iframe
    response.headers.delete "X-Frame-Options"
  end
end

Используйте его в своих контроллерах следующим образом:

class MyController < ApplicationController
  after_filter :allow_iframe, only: [:basic_embed, :awesome_embed]

  def basic_embed
      render_something
  end

  def awesome_embed
      render_something
  end

  # Other Actions...
end

Через: Rails 4: разрешить встраивание определенных действий в виде фреймов

person Sheharyar    schedule 11.03.2015

Я работаю с Rails 6 и Chromium 76. Предыдущее решение с X-Frame-Options не работает. Но я заметил, что это работает очень хорошо, когда мы подключаем онлайн-iframe с помощью JS. Итак, я только что сделал это простое решение, на мой взгляд:

<div id='iframe_wrapper' 'data-iframe-content'='<iframe src="https://host.com/"></iframe>'>
</div>

... и добавьте код JS следующим образом:

$(document).ready(function() {
  var wrapper = $('#iframe_wrapper')[0]
  wrapper.innerHTML = wrapper.attributes['data-iframe-content'].value
})
person Evgeny Danilov    schedule 01.10.2019

Обновление: кажется, что ALLOW-FROM и ALLOWALL в настоящее время являются недопустимыми значениями заголовка X-Frame-Options. Единственными двумя допустимыми являются DENY и SAMEORIGIN, и ни один из них не разрешает доступ из другого источника. См. документацию MDN: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options.

Похоже, что response.headers.delete "X-Frame-Options" — это единственный способ включить отображение контента в iframe на другом сайте. Но я хотел бы, чтобы было доказано обратное, если у кого-то есть какие-либо знания, которых нет у меня.

person Julia Jacobs    schedule 17.06.2021