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).
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'
}
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
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