J'essaie de tester un design réactif. J'utilise Rails 4. Je sais qu'il définit l'option 'X-Frame-Options' sur SAME Origin. Donc je l'ai annulé dans development.rb en utilisant
config.action_dispatch.default_headers = {
'X-Frame-Options' => 'ALLOWALL'
}
et cela a fonctionné. J'ai vérifié la demande de réseau dans la console Chrome et elle se présente comme suit:
Mais toujours des sites comme responsive.is et responsinator.com me donnent l'erreur ci-dessous:
Refused to display 'http://localhost:3000/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'. about:blank:1
Que se passe-t-il??
J'ai eu le même problème que vous et j'ai cherché une solution à ce problème toute la nuit.
J'ai finalement découvert pourquoi cela se produit. C'est à cause du cache Chrome.
Vous pouvez voir que header['X-Frame-Options']
est ALLOWALL
mais cela ne fonctionne pas.
Essayez simplement d’ouvrir une "Nouvelle fenêtre Incognito" et d’aller sur la même page et ça marche!
Ce problème ne s'est produit qu'en mode développement dans mon test. Cela a bien fonctionné en mode production.
Essayez juste de supprimer cet en-tête 'X-Frame-Options' . Peut-être de cette façon dans le contrôleur:
before_filter :allow_iframe_requests
...
def allow_iframe_requests
response.headers.delete('X-Frame-Options')
end
Rails 4
ajouté _ une valeur par défaut de X-Frame-Options
HTTP HTTP de SAMEORIGIN
. C'est bon pour la sécurité, mais lorsque vous voulez que votre action
soit appelée dans un iframe
, vous pouvez le faire:
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
Lorsque vous devez utiliser plus d'une de vos action
dans une iframe
, c'est une bonne idée de créer une méthode et de l'appeler avec :after_filter
:
class ApplicationController < ActionController::Base
private
def allow_iframe
response.headers.delete "X-Frame-Options"
end
end
Utilisez-le dans vos contrôleurs comme ceci:
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
Effectuez une actualisation complète dans votre navigateur ou utilisez un autre navigateur pour afficher les modifications.
Via: Rails 4: permet à des actions spécifiques d'être incorporées comme des iframes
J'ai eu un problème similaire où je continuais à avoir cette erreur seulement sur Firefox. J'avais une page Web PHP
hébergée @ MochaHost servant une application Rails
hébergée @ Heroku (donc l'application RoR a une page avec une iframe
qui pointe vers la page Web PHP
et qui fonctionne actuellement. tous les navigateurs sauf sur Firefox).
J'ai pu résoudre le problème en définissant un en-tête par défaut pour toutes mes demandes dans le fichier d'environnement spécifique:
# config/enviroments/production.rb
config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOWALL' }
Edit (Comme sheharyar suggéré)
Dans l'idéal, vous ne devriez pas définir d'en-tête par défaut et ne le faire que pour les actions devant être rendues dans un iFrame. Si l'intégralité de votre application est utilisée dans un iFrame, vous devez explicitement mentionner le Origin:
# config/enviroments/production.rb
config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOW-FROM http://some-Origin.com' }
Essayez ALLOW-FROM http://example.com
à la place? ALLOWALL pourrait bien fonctionner dans Chrome si vous avez une version suffisamment nouvelle de Chrome [2].
[1] https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
J'ai trouvé une autre cause à cela. En supposant que le correctif ALLOWALL ou un correctif similaire soit mis en œuvre, le prochain Gotcha tente d'utiliser le contenu http d'un site Web https, ce qui pose des risques pour la sécurité et est bloqué par Mozilla, IE et probablement d'autres navigateurs. Cela m'a pris 6 heures pour identifier cela, j'espère qu'en partageant je peux réduire la douleur de quelqu'un ...
Il peut être vérifié par:
La solution consiste à demander à la source si elle dispose d'un contenu https ou si elle trouve un autre fournisseur.
ref:
Si vous souhaitez que cette modification prenne effet dans tous les environnements, placez-la dans application.rb.