web-dev-qa-db-ja.com

「X-Frame-Options」が「ALLOWALL」であっても、iframeでRails 4アプリを表示できません

レスポンシブデザインをテストしようとしています。私はRails 4。

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

そしてそれは働いた。 Chromeコンソールでネットワーク要求をチェックアウトしました。次のようになります。

enter image description here

しかし、responsible.isやresponsinator.comのようなWebサイトでも、以下のエラーが表示されます。

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

どうしたの??

42
Steve Robinson

私はあなたと同じ問題を抱えていて、この問題の解決策を一晩中探しました。

私は最終的にそれが起こる理由を見つけました。 Chromeキャッシュが原因です。

header['X-Frame-Options']ALLOWALLですが、機能しません。

「新しいシークレットウィンドウ」を開いて同じページに移動してみてください。

この問題は、テストで開発モードでのみ発生しました。 プロダクションモードで問題なく動作しました。

27
Yi Feng Xie

このヘッダー「X-Frame-Options」を削除してみてください。おそらくコントローラーでこのように:

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

Rails 4追加 デフォルトのX-Frame-OptionsSAMEORIGINのHTTPヘッダー値。これはセキュリティには良いですが、doactioniframeを呼び出したい場合、これを行うことができます:


すべてのオリジンを許可するには:

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

:after_filterを使用します

actioniframeを複数使用する必要がある場合は、メソッドを作成して:after_filterで呼び出すことをお勧めします。

class ApplicationController < ActionController::Base

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

次のようにコントローラーで使用します。

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:特定のアクションをiframeとして埋め込む

22
Sheharyar

HerokuとFirefoxを使用して「X-Frame-Optionsによってロードが拒否された」場合

Firefoxでこのエラーonlyを取得し続ける同様の問題がありました。 @MochaHostがホストするPHP Webページがあり、@HerokuがホストするRailsアプリを提供していましたRoRアプリには、iframe Webページを指すPHPのページがあり、これはFirefoxを除くすべてのブラウザーで機能します)。

特定の環境ファイルのすべてのリクエストにデフォルトのヘッダーを設定することで、問題を解決できました。

# config/enviroments/production.rb

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

Edit(as sheharyar 提案)

理想的には、デフォルトのヘッダーを設定せず、iFrameでレンダリングする必要があるアクションに対してのみこれを行う必要があります。アプリ全体がiFrame内で提供される場合は、Originを明示的に指定する必要があります。

# config/enviroments/production.rb

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

ALLOW-FROM http://example.com代わりに? Chrome Chrome [2]

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

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

1
Thong Kuah

別の原因が見つかりました。 ALLOWALLまたは同様の修正が実装されていると仮定すると、次の落とし穴はhttps Webサイトでhttpコンテンツを使用しようとしているため、セキュリティリスクを引き起こし、mozilla、IEおよびおそらく他のブラウザーによってブロックされます。これを特定するのに6時間かかりました。共有することで誰かの痛みを減らすことができれば幸いです...

次の方法で確認できます。

  • ブラウザのWebツールを使用すると、エラーが表示されるはずです。
  • webログには、供給サイトとの接続がありません。
  • コンテンツのURLを銀行のhttpsに置き換えてください。httpsのホームページでは、iframeの動作を確認できます。

解決策は、ソースにhttpsコンテンツがあるかどうかを尋ねるか、別のサプライヤーを見つけることです。

ref:

0
Matt Stevens

この変更をすべての環境で有効にする場合は、application.rbに配置します。

0
calasyr