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 55

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 значение заголовка HTTP SAMEORIGIN. Это хорошо для безопасности, но когда вы 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