it-swarm.com.de

Meine Rails 4-App kann nicht in iframe angezeigt werden, auch wenn 'X-Frame-Options' 'ALLOWALL' ist.

Ich versuche, ein responsives Design zu testen. Ich verwende Rails 4. Ich weiß, es setzt 'X-Frame-Options' auf SAME Origin. Also habe ich es in development.rb mit überschrieben

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

und es hat funktioniert. Ich habe die Netzwerkanforderung in der Chrome-Konsole ausgecheckt und lautet wie folgt:

enter image description here

Aber immer noch geben Websites wie responsive.is und responsinator.com den folgenden Fehler ab:

Refused to display 'http://localhost:3000/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'. about:blank:1

Was ist los??

42
Steve Robinson

Ich hatte das gleiche Problem wie Sie und habe die ganze Nacht nach einer Lösung für dieses Problem gesucht.

Ich habe endlich herausgefunden, warum es passiert. Es liegt am Chrome-Cache.

Sie können sehen, dass header['X-Frame-Options']ALLOWALL ist, aber es funktioniert nicht.

Versuchen Sie einfach, ein "Neues Inkognito-Fenster" zu öffnen und die gleiche Seite aufzurufen, und es funktioniert!

Dieses Problem trat nur im Entwicklungsmodus in meinem Test auf. Es hat gut funktioniert im Produktionsmodus .

27
Yi Feng Xie

Versuchen Sie einfach, diesen Header 'X-Frame-Options' zu löschen . Vielleicht auf diese Weise im Controller:

before_filter :allow_iframe_requests
...
def allow_iframe_requests
  response.headers.delete('X-Frame-Options')
end
65
Timrael

Rails 4hinzugefügt ein Standardwert für den HTTP-Header X-Frame-Options Von SAMEORIGIN. Dies ist gut für die Sicherheit, aber wenn Sie do möchten, dass Ihr action in einem iframe aufgerufen wird, können Sie dies tun:


So lassen Sie alle Ursprünge zu:

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

So erlauben Sie einen bestimmten Ursprung:

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

Verwenden Sie: after_filter

Wenn Sie mehrere Ihrer action in einem iframe verwenden müssen, ist es eine gute Idee, eine Methode zu erstellen und mit :after_filter Aufzurufen:

class ApplicationController < ActionController::Base

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

Verwenden Sie es in Ihren Controllern wie folgt:

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

Führen Sie eine Hard-Refresh-Aktualisierung in Ihrem Browser durch, oder verwenden Sie einen anderen Browser, um Änderungen anzuzeigen

Via: Rails 4: bestimmte Aktionen als iframes einbetten lassen

22
Sheharyar

Wenn "Laden mit X-Frame-Optionen" mit Heroku & Firefox verweigert wird

Ich hatte ein ähnliches Problem, bei dem ich diesen Fehler only in Firefox immer wieder bekam. Ich hatte eine PHP-Webseite gehostet @ MochaHost, die eine Rails-App bereitstellt, die @ Herokugehostet wird (so dass die RoR-App eine Seite mit einer iframe hat, die auf die PHP-Webseite verweist und diese Seite arbeitet alle Browser außer Firefox).

Ich konnte das Problem lösen, indem ich einen Standardheader für alle meine Anforderungen in der spezifischen Umgebungsdatei setzte:

# config/enviroments/production.rb

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

Edit (Wie sheharyar vorgeschlagen)

Idealerweise sollten Sie keinen Standardheader festlegen und dies nur für Aktionen tun, die in einem iFrame gerendert werden müssen. Wenn Ihre gesamte App in einem iFrame bereitgestellt wird, sollten Sie das Origin explizit erwähnen:

# config/enviroments/production.rb

config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOW-FROM http://some-Origin.com' }
9
d1jhoni1b

Versuchen Sie stattdessen ALLOW-FROM http://example.com? ALLOWALL ist in Chrome möglicherweise in Ordnung, wenn Sie eine ausreichend neue Version von Chrome haben. [2]

[1] https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options

[2] https://stackoverflow.com/a/16101968/800526

1
Thong Kuah

Ich habe einen anderen Grund dafür gefunden. Unter der Annahme, dass ALLOWALL oder ein ähnlicher Fix implementiert wurde, versucht der nächste Benutzer, HTTP-Inhalte in einer https-Website zu verwenden, was Sicherheitsrisiken verursacht und von Mozilla, IE und möglicherweise anderen Browsern blockiert wird. Ich habe 6 Stunden gebraucht, um das herauszufinden, hoffentlich kann ich durch das Teilen die Schmerzen einiger Menschen reduzieren ...

Es kann überprüft werden durch:

  • verwenden Sie die Web-Tools Ihres Browsers, die einen Fehler anzeigen sollen. 
  • webprotokollen haben keine Verbindung zu Ihrer liefernden Site. 
  • ersetzen Sie Ihre Inhalts-URL durch eine https-Startseite der Bank, die zeigt, dass der iframe ansonsten funktioniert.

Die Lösung besteht darin, die Quelle nach https-Inhalten zu fragen oder einen anderen Anbieter zu finden.

ref:

0
Matt Stevens

Wenn Sie möchten, dass diese Änderung in allen Umgebungen wirksam wird, platzieren Sie sie in application.rb.

0
calasyr