Невозможно отобразить приложение 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
Что происходит?
Ответы
Ответ 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' }
Ответ 5
Попробуйте ALLOW-FROM http://example.com
вместо этого? ALLOWALL может быть в порядке в Chrome, если у вас достаточно новая версия Chrome [2]
[1] https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
[2] fooobar.com/questions/136630/...
Ответ 6
Если вы хотите, чтобы это изменение вступало в силу во всех средах, поместите его в application.rb.
Ответ 7
Я нашел для этого еще одну причину. Предполагая, что ALLOLALL или аналогичное исправление реализовано, следующий getcha пытается использовать http-контент на https-сайте, который вызывает угрозы безопасности, и блокируется mozilla, IE и, возможно, другими браузерами. Мне потребовалось 6 часов, чтобы определить это, надеюсь, поделившись, я могу уменьшить кому-то боль...
Его можно проверить:
- с помощью веб-инструментов браузера, которые должны отображать ошибку.
- В веб-журналах отсутствует соединение с вашим сайтом.
- замените URL-адрес вашего содержимого на домашнюю страницу https на банковских счетах, чтобы продемонстрировать, что iframe работает в противном случае.
Решение состоит в том, чтобы спросить источник, есть ли у них контент https или найти другого поставщика.
ссылка