ruby on rails - No puedo mostrar la aplicación Rails 4 en iframe incluso si ''X-Frame-Options'' es ''ALLOWALL''
ruby-on-rails responsive-design (7)
Cuando ''Carga denegada por X-Frame-Options'' usando Heroku y Firefox
Tuve un problema similar donde seguí recibiendo este error solo en Firefox. Tenía una página web PHP
alojada en MochaHost que sirve una aplicación de Rails
alojada en Heroku (así que la aplicación RoR tiene una página con un iframe
que apunta a la página web PHP
y funciona en todos los navegadores, excepto en Firefox).
Pude resolver el problema estableciendo un encabezado predeterminado para todas mis solicitudes en el archivo de entorno específico:
# config/enviroments/production.rb
config.action_dispatch.default_headers = { ''X-Frame-Options'' => ''ALLOWALL'' }
Editar (como sugirió )
Idealmente, no debe establecer un encabezado predeterminado y hacer esto solo para las acciones que se deben representar en un iFrame. Si toda su aplicación se sirve dentro de un iFrame, debe mencionar explícitamente el Origen :
# config/enviroments/production.rb
config.action_dispatch.default_headers = { ''X-Frame-Options'' => ''ALLOW-FROM http://some-origin.com'' }
Estoy tratando de probar un diseño receptivo. Estoy usando Rails 4. Sé que establece ''X-Frame-Options'' en SAME ORIGIN. Así que lo sobreescribí en development.rb usando
config.action_dispatch.default_headers = {
''X-Frame-Options'' => ''ALLOWALL''
}
Y funcionó. Revisé la solicitud de red en la consola de Chrome y es la siguiente:
Pero aún sitios web como responsive.is y responsinator.com me dan el siguiente error:
Refused to display ''http://localhost:3000/'' in a frame because it set ''X-Frame-Options'' to ''SAMEORIGIN''. about:blank:1
¿¿Que esta pasando??
Encontré otra causa para esto. Suponiendo que se implementa la solución ALLOWALL o similar, el siguiente intento es utilizar contenido http en un sitio web https que causa riesgos de seguridad y está bloqueado por mozilla, IE y probablemente otros navegadores. Me llevó 6 horas identificar esto, espero que al compartir pueda reducir el dolor de alguien ...
Puede ser verificado por:
- utilizando las herramientas web de su navegador que deberían mostrar un error.
- los registros web carecerán de conexión con su sitio de suministro.
- reemplace su URL de contenido con una página de inicio de https del banco debe demostrar que el iframe funciona de otra manera.
La solución es preguntar a la fuente si tienen contenido https o encontrar otro proveedor.
árbitro:
Intente simplemente eliminar este encabezado ''X-Frame-Options''. Tal vez de esta manera en el controlador:
before_filter :allow_iframe_requests
...
def allow_iframe_requests
response.headers.delete(''X-Frame-Options'')
end
Pruebe ALLOW-FROM http://example.com
lugar? ALLOWALL podría estar bien en Chrome si tienes una versión suficientemente nueva de Chrome [2]
[1] https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
[2] https://.com/a/16101968/800526
Si desea que este cambio surta efecto en todos los entornos, colóquelo en application.rb.
Tuve el mismo problema que tú, y busqué una solución a este problema toda la noche.
Finalmente descubrí por qué sucede. Es a causa de la memoria caché de Chrome.
Puedes ver que el header[''X-Frame-Options'']
es ALLOWALL
pero no funciona.
Intenta abrir una "Nueva ventana de incógnito" y ve la misma página, ¡y funciona!
Este problema solo sucedió en modo de desarrollo en mi prueba. Funcionó bien en modo de producción .
Rails 4
added un valor predeterminado de encabezado HTTP de X-Frame-Options
de SAMEORIGIN
. Esto es bueno para la seguridad, pero cuando desea que su action
sea llamada en un iframe
, puede hacer esto:
Para permitir todos los orígenes:
class MyController < ApplicationController
def iframe_action
response.headers.delete "X-Frame-Options"
render_something
end
end
Para permitir un origen específico:
class MyController < ApplicationController
def iframe_action
response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-origin.com"
render_something
end
end
Uso: after_filter
Cuando necesite usar más de una de sus action
en un iframe
, es una buena idea hacer un método y llamarlo con :after_filter
:
class ApplicationController < ActionController::Base
private
def allow_iframe
response.headers.delete "X-Frame-Options"
end
end
Úselo en sus controladores de esta manera:
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
Realice un Refresco Difícil en su navegador, o use otro navegador para ver los cambios
Vía: Rails 4: permite que las acciones específicas se incrusten como iframes