Aplikacja Ruby on rails 4 nie działa w iframe

Jak mogę osadzić moją aplikację rails na innej stronie poprzez iframe?

To działa ładnie z RoR 3, ale nie z ror 4:

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

Próbowałem użyć opcji verify_authenticity_token i protect_from_forgery w moim kontrolerze... wydaje się, że to coś innego (ale nie jestem pewien).

Upd. Przykład: http://jsfiddle.net/zP329/
Author: Noam Hacker, 2013-05-15

2 answers

Ma to związek z tym, że Rails 4 domyślnie włącza dodatkowe protokoły bezpieczeństwa: http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/

Ustawienie, które łamie ramki iframe w zdalnych witrynach, to X-Frame-Options. Domyślnie jest to ustawione na SAMEORIGIN, co zapobiega wczytywaniu zawartości między domenami:

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

Możesz przeczytać o nowych domyślnych nagłówkach tutaj: http://edgeguides.rubyonrails.org/security.html#default-headers

W celu Zezwalaj ramce iFrame na działanie między domenami, możesz zmienić domyślne nagłówki, aby zezwalały na ramkę X między domenami.

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'ALLOWALL'
}
 100
Author: jcypret,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-18 04:41:02

Rails 4 dodano domyślną wartość nagłówka HTTP X-Frame-Options. To jest dobre dla bezpieczeństwa, ale kiedy zrobić chcesz, aby Twoje action być wywołane w iframe, możesz to zrobić:


Aby umożliwić wszystkie pochodzenie:

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


Aby umożliwić określone pochodzenie:

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


Użyj: after_filter

Kiedy musisz użyć więcej niż jednego ze swoich action w iframe, dobrym pomysłem jest stworzenie metody i wywołanie jej za pomocą :after_filter:

class ApplicationController < ActionController::Base

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

Użyj go w kontrolerach tak:

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: niech konkretne działania będą osadzone jak ramki iFrame

 47
Author: Sheharyar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 03:03:20