Подтвердить что ты не робот

Невозможно отобразить приложение rails 4 в iframe, даже если "X-Frame-Options" - "ALLOWALL"

Я пытаюсь проверить отзывчивый дизайн. Я использую Rails 4. Я знаю, что он устанавливает "X-Frame-Options" в SAME ORIGIN. Поэтому я переопределил его в development.rb, используя

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

и это сработало. Я проверил сетевой запрос в консоли Chrome, и он выглядит следующим образом:

enter image description here

Но все же сайты, такие как responsive.is и responsinator.com, дают мне ошибку ниже:

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

Что происходит?

4b9b3361

Ответ 1

У меня была та же проблема, что и вы, и искал решение этой проблемы всю ночь.

Наконец-то я узнал, почему это происходит. Это из-за кеша Chrome.

Вы можете видеть, что header['X-Frame-Options'] есть ALLOWALL, но он не работает.

Просто попробуйте открыть "Новое окно инкогнито" и перейти на ту же страницу, и он работает!

Эта проблема произошла только в режиме разработки в моем тесте. Он отлично работал в режиме производства.

Ответ 2

Попробуйте просто удалить этот заголовок "X-Frame-Options". Возможно, так в контроллере:

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

Ответ 3

Rails 4 добавлено значение по умолчанию X-Frame-Options HTTP-заголовка SAMEORIGIN. Это полезно для безопасности, но когда вы хотите, чтобы ваш action вызывался в iframe, вы можете сделать это:


Разрешить все происхождение:

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

Если вам нужно использовать более одного из action в iframe, рекомендуется создать метод и вызвать его с помощью :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

Сделайте жесткое обновление в своем браузере или используйте другой браузер для просмотра изменений

Через: Rails 4: включить определенные действия в качестве iframes

Ответ 4

Когда "Load denied by X-Frame-Options" использует Heroku и Firefox

У меня была аналогичная проблема, когда я продолжал получать эту ошибку только в Firefox. У меня была веб-страница PHP, размещенная @MochaHost, обслуживающая приложение Rails, размещенное на сайте @Heroku (поэтому приложение RoR имеет страницу с iframe, которая указывает на веб-страницу PHP, и это работает во всех браузерах, кроме Firefox).

Мне удалось решить проблему, установив заголовок по умолчанию для всех моих запросов в конкретном файле среды:

# config/enviroments/production.rb

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

Edit (как предлагалось sheharyar)

В идеале вы не должны устанавливать заголовок по умолчанию и делать это только для действий, которые должны отображаться в iFrame. Если ваше приложение будет обслуживаться внутри iFrame, вы должны явно указать Origin:

# config/enviroments/production.rb

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

Ответ 6

Если вы хотите, чтобы это изменение вступало в силу во всех средах, поместите его в application.rb.

Ответ 7

Я нашел для этого еще одну причину. Предполагая, что ALLOLALL или аналогичное исправление реализовано, следующий getcha пытается использовать http-контент на https-сайте, который вызывает угрозы безопасности, и блокируется mozilla, IE и, возможно, другими браузерами. Мне потребовалось 6 часов, чтобы определить это, надеюсь, поделившись, я могу уменьшить кому-то боль...

Его можно проверить:

  • с помощью веб-инструментов браузера, которые должны отображать ошибку.
  • В веб-журналах отсутствует соединение с вашим сайтом.
  • замените URL-адрес вашего содержимого на домашнюю страницу https на банковских счетах, чтобы продемонстрировать, что iframe работает в противном случае.

Решение состоит в том, чтобы спросить источник, есть ли у них контент https или найти другого поставщика.

ссылка