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
параметры в моем контроллере... кажется, это что-то другое (но я не уверен).
upd. Образец: http://jsfiddle.net/zP329/
2 ответа:
Это связано с 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' }
Rails 4
добавил по умолчаниюX-Frame-Options
значение заголовка HTTPSAMEORIGIN
. Это хорошо для безопасности, но когда вы do хотите, чтобы ваш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
Via:Rails 4: пусть конкретные действия будут встроены как iframes