Iframe Not rendering [duplicate]

  UPDATE table_a SET sequence_column = (выберите rn from (выберите rowid, row_number () over (order by col1, col2) from table_a) x где x.rowid = table_a.rowid)  

Но это будет не очень быстро, и, как указал Дэмиен, вы должны повторно запускать это утверждение каждый раз, когда вы меняете данные в этой таблице.

392
задан abraham 12 March 2012 в 20:01
поделиться

24 ответа

У меня была аналогичная проблема, когда я пытался отображать содержимое на нашем собственном сайте в iframe (в качестве диалогового окна в стиле лайтбокса с Colorbox ) и где у нас был серверный " X-Frame-Options SAMEORIGIN "на исходном сервере, не позволяя ему загружаться на нашем тестовом сервере.

Это нигде не документируется, но если вы можете редактировать страницы, которые вы пытаетесь iframe (например, это ваши собственные страницы), просто отправляя другой заголовок X-Frame-Options с любой строкой, вообще отключает команды SAMEORIGIN или DENY.

, например. для PHP, помещая

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

в верхней части страницы, сделайте браузеры объединенными двумя, что приведет к заголовку

X-Frame-Options SAMEORIGIN, GOFORIT

... и позволит вам загрузите страницу в iframe. Это, похоже, работает, когда начальная команда SAMEORIGIN была установлена ​​на уровне сервера, и вы хотели бы переопределить ее в каждом отдельном случае.

Все самое лучшее!

195
ответ дан mc10 17 August 2018 в 12:47
поделиться
  • 1
    У меня была рамка вокруг веб-сайта. На моем веб-сайте я перенаправляюсь к Instagram для OAUTH. Поскольку Instagram отправляет X-Frame-Options: SAMEORIGIN, в кадре нет возможности сделать это. Вы должны использовать всплывающее окно. – Steve Tauber 3 September 2012 в 20:07
  • 2
    С PHP, вероятно, лучше использовать новую функцию header_remove , если у вас есть ее (& gt; = 5.3.0). – a cat 9 February 2013 в 02:19
  • 3
    Или вы можете редактировать .htaccess, если хотите удалить X-Frame-Options из всего каталога. Просто добавьте строку: Header always unset X-Frame-Options – Jay 20 June 2013 в 21:41
  • 4
    @cawecoy: Ну да, все дело в том, что это неверно. Он полагается на браузеры, игнорирующие недопустимый заголовок и «failing open», что является неуказанным поведением и довольно хитроумным, чтобы полагаться. GOFORIT (или другой случайный произвольный недопустимый токен) намеренно нарушает меру безопасности, применяемую сервером; если вы сами контролируете сервер (что вы должны сделать для любой реальной публичной службы), то правильная вещь - просто установить сервер, чтобы не устанавливать заголовок в первую очередь. – bobince 5 September 2013 в 11:59
  • 5
    Это, похоже, больше не работает в Chrome. Недопустимые значения вызывают значение по умолчанию DENY. – jamesfm 19 February 2014 в 10:29

У меня была эта проблема, и я решил изменить httpd.conf

<IfModule headers_module>
    <IfVersion >= 2.4.7 >
        Header always setifempty X-Frame-Options GOFORIT
    </IfVersion>
    <IfVersion < 2.4.7 >
        Header always merge X-Frame-Options GOFORIT
    </IfVersion>
</IfModule>

, и я изменил SAMEORIGIN, чтобы перейти к нему, и перезапустил сервер

0
ответ дан Arthur 17 August 2018 в 12:47
поделиться

Похоже, что X-Frame-Options Allow-From https: // ... обесценивается и заменяется (и игнорируется), если вместо этого используется заголовок Content-Security-Policy.

Здесь это полная ссылка: https://content-security-policy.com/

5
ответ дан Dr. Aaron Dishno 17 August 2018 в 12:47
поделиться

Если вы пытаетесь внедрить Vimeo в эту ошибку, измените src iframe, от: https://vimeo.com/63534746 до: http: // player.vimeo.com/video/63534746

20
ответ дан Eric Corriel 17 August 2018 в 12:47
поделиться

Решение для загрузки внешнего веб-сайта в iFrame даже жестко, параметр x-frame установлен на отказ на внешнем веб-сайте.

Если вы хотите загрузить другой сайт в iFrame, и вы получите Display forbidden by X-Frame-Options”, тогда вы можете действительно преодолеть это, создав скрипт прокси-сервера на стороне сервера.

Атрибут src iFrame может иметь URL-адрес, похожий на этот: /proxy.php?url=https://www.example.com/page&key=somekey

Тогда proxy.php будет выглядеть примерно так:

if (isValidRequest()) {
   echo file_get_contents($_GET['url']);
}

function isValidRequest() {
    return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) && 
    $_GET['key'] === 'somekey';
}

Это передается блоком, потому что это просто запрос GET, который также может быть обычным посещением страницы браузера.

Знайте: вы можете улучшить безопасность в этом скрипте. Поскольку хакеры могут загружаться на веб-страницах через ваш прокси-скрипт.

4
ответ дан Floris 17 August 2018 в 12:47
поделиться

Я использовал Tomcat 8.0.30, ни один из предложений не работал для меня. Поскольку мы хотим обновить X-Frame-Options и установить его на ALLOW, вот как я настроил разрешить встроенные iframes:

  • Перейдите в каталог Tomcat conf, отредактируйте файл web.xml
  • Добавить фильтр ниже:
<filter>
            <filter-name>httpHeaderSecurity</filter-name>
            <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
                   <init-param>
                           <param-name>hstsEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingOption</param-name>
                           <param-value>ALLOW-FROM</param-value>
                   </init-param>
            <async-supported>true</async-supported>
       </filter>

       <filter-mapping>
                   <filter-name>httpHeaderSecurity</filter-name>
                   <url-pattern>/*</url-pattern>
                   <dispatcher>REQUEST</dispatcher>
       </filter-mapping> 
  • Перезапустить службу Tomcat
  • Доступ к ресурсам с помощью iFrame.
2
ответ дан Giri 17 August 2018 в 12:47
поделиться

Удивительно, что никто из них никогда не упоминал настройки сервера Apache сервера (*.conf) или .htaccess как причину этой ошибки. Найдите в файлах конфигурации .htaccess или Apache, чтобы убедиться, что у вас нет следующего набора DENY:

Header always set X-Frame-Options DENY

Смените его на SAMEORIGIN, делает работу так, как ожидалось:

Header always set X-Frame-Options SAMEORIGIN

1
ответ дан Ilia Rostovtsev 17 August 2018 в 12:47
поделиться
  • 1
    это было упомянуто ранее - см. комментарий от @Jay о ответе stackoverflow.com/a/6767901/1875965 – Sandra 22 December 2015 в 15:53
  • 2
    I config .conf file Header всегда задает X-Frame-Options SAMEORIGIN! – GeekHades 27 April 2017 в 06:24
  • 3
    Большое спасибо, он работает для меня! – GeekHades 27 April 2017 в 06:24
  • 4
    Но как это относится к вопросу здесь, где заголовок поступает из foreign серверов, непосредственно к client , IOW ваш собственный сервер даже не задействован? Я что-то упускаю? – Sz. 23 March 2018 в 22:11

target = '_ parent'

Используя идею Кевина Веллы, я попытался добавить этот атрибут, чтобы сформировать элементы, созданные генератором кнопок PayPal. Работала для меня, чтобы Paypal не открывался в новом окне браузера / вкладке.

2
ответ дан jiminikiz 17 August 2018 в 12:47
поделиться

У меня была такая же проблема с mediawiki, потому что сервер отказал в встраивании страницы в iframe по соображениям безопасности.

Я решил записать

$wgEditPageFrameOptions = "SAMEORIGIN"; 

в Файл конфигурации mediawiki php.

Надеюсь, что это поможет.

4
ответ дан John White 17 August 2018 в 12:47
поделиться

Я попробовал почти все предложения. Однако единственное, что действительно решило проблему, было:

  1. Создайте .htaccess в той же папке, где находится ваш PHP-файл.
  2. Добавьте эту строку в htaccess : Header always unset X-Frame-Options

Встраивание PHP с помощью iframe из другого домена должно работать позже.

Кроме того, вы могли бы добавить в начало вашего PHP-файла:

header('X-Frame-Options: ALLOW');

Это было, однако, не обязательно в моем случае.

4
ответ дан Kai Noack 17 August 2018 в 12:47
поделиться
  • 1
    Заголовок всегда отключен X-Frame-Options в htaccess сделал трюк для меня – ujwal dhakal 15 March 2017 в 08:44

Добавление

  target='_top'

к моей ссылке на вкладке facebook устраняет проблему для меня ...

22
ответ дан Kevin Vella 17 August 2018 в 12:47
поделиться
  • 1
    У меня была та же проблема с iframe Paypal, содержащимся в другом iframe. Он работает сейчас! благодаря – Fabrizio Fortino 25 October 2012 в 08:12
  • 2
    Я также добавил target = '_ top', но проблема с этим решением заключается в том, что ссылка теперь открывается за пределами iframe на новой вкладке без холста facebook. – sumitkanoje 6 April 2013 в 16:23
  • 3
    Это хорошее решение, используя панель формы в gwt – x20mar 31 January 2014 в 17:34
  • 4
    Это не похоже на сафари ... – Wtower 30 June 2016 в 10:29

Я столкнулся с этой проблемой при запуске веб-сайта wordpress. Я пробовал всевозможные вещи, чтобы исправить это, и не знал, как, в конечном счете, проблема была в том, что я использовал DNS-переадресацию с маскировкой, а ссылки на внешние сайты неправильно обрабатывались. т. е. мой сайт был размещен в http: //123.456.789/index.html , но был замаскирован для запуска в http://somewebSite.com/index.html . Когда я ввел http: //123.456.789/index.html в браузере, щелкнув по тем же ссылкам, в результате не возникло проблем с X-фреймами в консоли JS, но запущено http: //somewebSite.com/index.html. Чтобы правильно маскировать, вы должны добавить DNS-серверы своего хоста в свою службу домена, то есть у godaddy.com должны быть серверы имен, например ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com, если вы были используя digitalocean.com в качестве вашего хостинга.

1
ответ дан kinghenry14 17 August 2018 в 12:47
поделиться
  • 1
    Я закончил работу: remove_action( 'admin_init', 'send_frame_options_header',10);, чтобы обойти эту проблему ... – majick 23 June 2016 в 13:45

Это ребята!

FB.Event.subscribe('edge.create', function(response) {
    window.top.location.href = 'url';
});

Единственное, что работало в приложениях facebook!

7
ответ дан Konst 17 August 2018 в 12:47
поделиться

Единственный реальный ответ, если вы не контролируете заголовки источника, который вы хотите в своем iframe, это прокси-сервер. Попросите сервер действовать как клиент, получите источник, разделите проблемные заголовки, добавьте CORS, если необходимо, а затем выполните ping на своем собственном сервере.

Есть еще один ответ, объясняющий, как писать такой прокси. Это не сложно, но я был уверен, что кто-то должен был это сделать раньше. По какой-то причине было трудно найти его.

Я, наконец, нашел некоторые источники:

https://github.com/Rob--W/cors -anywhere / # documentation

^ предпочтительнее. Если вам нужно редкое использование, я думаю, вы можете просто использовать его приложение heroku. В противном случае, это код для запуска его самостоятельно на вашем собственном сервере. Заметьте, какие ограничения существуют.

anyorigin.org

^ второй выбор, но довольно старый. предположительно более новый выбор в python: https://github.com/Eiledon/alloworigin

, тогда есть третий вариант:

http: / /anyorigin.com/

Который, кажется, позволяет немного бесплатного использования, но поместит вас в публичный список позоров, если вы не платите и не используете какую-то неуказанную сумму, которую вы можете удаляться, если вы платите пошлину ...

1
ответ дан Kyle Baker 17 August 2018 в 12:47
поделиться

Не упоминается, но может помочь в некоторых случаях:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState !== 4) return;
    if (xhr.status === 200) {
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write(xhr.responseText);
        doc.close();
    }
}
xhr.open('GET', url, true);
xhr.send(null);
0
ответ дан mattdlockyer 17 August 2018 в 12:47
поделиться

У меня была такая же проблема, когда я попытался внедрить moodle 2 в iframe, решение - Site administration ► Security ► HTTP security и проверить Allow frame embedding

12
ответ дан Mohammad Ali Akbari 17 August 2018 в 12:47
поделиться
  • 1
    хорошо сделанный для метода moodle, так как другие методы не могут быть перезаписаны. – ericosg 18 October 2013 в 08:58

Единственный вопрос, который имеет кучу ответов. Удостоверьтесь в путеводителе, которого я хотел бы, когда я пытался с этим справиться, чтобы он работал в 10:30 ночью в день истечения срока ... FB делает некоторые странные вещи с приложениями для холста, и хорошо, вас предупреждают. Если вы все еще здесь, и у вас есть приложение Rails, которое появится за Facebook Canvas, вам понадобится:

Gemfile:

gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'

config / facebook.yml

facebook:
  key: "123123123123"
  secret: "123123123123123123secret12312"

config / application.rb

config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false

config / initializers / omniauth.rb

OmniAuth.config.logger = Rails.logger
SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read)
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe:   true
end

application_controller.rb

before_filter :add_xframe
def add_xframe
  headers['X-Frame-Options'] = 'GOFORIT'
end

Вам нужен контроллер для вызова из настроек холста Facebook, я использовал /canvas/ и сделал маршрут для основного SiteController для этого приложения:


class SiteController < ApplicationController
  def index
    @user = User.new
  end
  def canvas
    redirect_to '/auth/failure' if request.params['error'] == 'access_denied'
    url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login"
    redirect_to url
  end
  def login
  end
end

login.html.erb


<% content_for :javascript do %>
  var oauth_url = 'https://www.facebook.com/dialog/oauth/';
  oauth_url += '?client_id=471466299609256';
  oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/');
  oauth_url += '&scope=email,status_update,publish_stream';
console.log(oauth_url);
  top.location.href = oauth_url;
<% end %>

Источники

  • Конфигурация, на мой взгляд, взята из примера omniauth.
  • Файл gem (который является ключом !!!) пришел из: файлов слайд-шоу, которые я узнал ...
  • Этот вопрос в стеке имел весь угол Xframe , поэтому вы получите пустое место, если вы не поместите этот заголовок в контроллер приложения.
  • И мой человек @rafmagana написал этот heroku guide , который теперь вы может принять за рельсы с этим ответом и плечами гигантов, в которые вы идете.
2
ответ дан pjammer 17 August 2018 в 12:47
поделиться

Если вы получаете эту ошибку при попытке вставить карту Google в iframe, вам нужно добавить &output=embed к исходной ссылке.

123
ответ дан Q Studio 17 August 2018 в 12:47
поделиться
  • 1
    Это справедливо только для встраивания карт google в iframe, а не для общего «решения». – Benjamin Wohlwend 29 September 2011 в 08:55
  • 2
    Мне нужно было встроить карту google в лайтбокс, так что это «решение» был идеальным – yitwail 11 October 2011 в 00:01
  • 3
    Если вы пытаетесь сделать это с намерением сети Twitter, забудьте об этом. Просто потерял весь день, пытаясь использовать разные плагины для освещения, чтобы узнать это. «Пока вы можете предоставлять ссылки на намерения в IFRAME и виджетах, результирующие страницы не могут быть загружены в IFRAME. & Quot; Источник: сайт Twitter. – Gubatron 26 January 2012 в 04:21
  • 4
    Это не работает, если вы пытаетесь загрузить iframe src после остальной загрузки страницы, даже если добавить &output=embed – pathfinder 22 March 2013 в 00:52
  • 5
    @pathfinder Это сработало для меня, когда у меня возникли проблемы с загрузкой iframe src после загрузки страницы – David Sykes 4 February 2014 в 13:58

Используйте эту строку ниже, вместо функции header().

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";
2
ответ дан Ram Sharma 17 August 2018 в 12:47
поделиться

Я не уверен, насколько это уместно, но я создал для этого обход. На моем сайте я хотел отобразить ссылку в модальном окне, содержащем iframe, который загружает URL-адрес.

Что я сделал, я связал событие click ссылки на эту функцию javascript. Все это делает запрос к файлу PHP, который проверяет заголовки URL-адресов для X-FRAME-Options перед тем, как решить, загружать ли URL-адрес в модальное окно или перенаправлять.

Вот функция:

  function opentheater(link, title){
        $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) {
  if(data == "ya"){
      $(".modal-title").html("<h3 style='color:480060;'>"+title+"&nbsp;&nbsp;&nbsp;<small>"+link+"</small></h3>");
        $("#linkcontent").attr("src", link);
        $("#myModal").modal("show");
  }
  else{
      window.location.href = link;
      //alert(data);
  }
});


        }

Вот код файла PHP, который проверяет его:

<?php
$url = rawurldecode($_REQUEST['url']);
$header = get_headers($url, 1);
if(array_key_exists("X-Frame-Options", $header)){
    echo "nein";
}
else{
    echo "ya";
}


?>

Надеюсь, это поможет.

1
ответ дан swatkat7 17 August 2018 в 12:47
поделиться

Вы можете обойти X-Frame-Options в <iframe>, используя только клиентский JavaScript и YQL . Вот доказательство концепции: Hacker News в <iframe> . (Проверено в Chrome & amp; Firefox, если оно не работает, попробуйте обновить страницу.)

Процесс выглядит следующим образом:

  1. Запросить URL-адрес iframe из YQL (функция loadURL),
  2. Получить данные HTML из YQL (функция getData),
  3. Добавить загружаемые ссылки <base link> и <script> в iframe, используя YQL,
  4. Внедрить этот HTML в пустой <iframe> (функция loadHTML).

Пример кода JS:

var iframe = document.getElementsByTagName('iframe')[0];
var url = iframe.src;
var getData = function (data) {
    if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content);
    else if (data && data.error && data.error.description) loadHTML(data.error.description);
    else loadHTML('Error: Cannot load ' + url);
};
var loadURL = function (src) {
    url = src;
    var script = document.createElement('script');
    script.src = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData';
    document.body.appendChild(script);
};
var loadHTML = function (html) {
    iframe.src = 'about:blank';
    iframe.contentWindow.document.open();
    iframe.contentWindow.document.write(html.replace(/<head>/i, '<head><base href="' + url + '"><scr' + 'ipt>document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });</scr' + 'ipt>'));
    iframe.contentWindow.document.close();
} 
loadURL(iframe.src);
41
ответ дан Sz. 17 August 2018 в 12:47
поделиться
  • 1
    Это интересное решение. Хорошо работает в FF / Chrome / Opera, но не работает в IE / Edge. Кто знает что-нибудь, что будет? – Collector 18 August 2015 в 04:49
  • 2
    Это больше не работает. Он дает «Отказ отображать» news.ycombinator.com / & # 39 ; в кадре, потому что он устанавливает «X-Frame-Options» в «DENY». & quot; как ожидаемый – g.pickardou 11 December 2015 в 12:17
  • 3
    @ g.pickardou Это работает для меня в Google Chrome 46, я вижу Hacker News в iframe. – niutech 10 January 2016 в 16:24
  • 4
    Больше не работает для Chrome 63 – mark 14 December 2017 в 09:07
  • 5
    @niutech эта скрипка работает после перезагрузки страницы в Chrome 64, но в первый раз, когда я загружаю страницу, она не работает. (Попробуйте инкогнито.) – Carl Walsh 6 March 2018 в 13:53

В Chrome есть плагин для этого заголовка (для личного использования):

https://chrome.google.com/webstore/detail/ignore-x- каркасно-заголовки / gleekbfjekiniecknbkamfmkohkpodhe / обзоры

18
ответ дан user 17 August 2018 в 12:47
поделиться
  • 1
    Вы знаете, как работает этот плагин? :) – aup 28 January 2015 в 09:46
  • 2
    @aup Возможно, он внесет некоторые изменения в заголовочную часть веб-страницы. – user 30 January 2015 в 18:10

Если вы получаете эту ошибку для видео YouTube, вместо того, чтобы использовать полный URL-адрес, используйте URL-адрес встраивания из параметров совместного доступа. Он будет выглядеть как http://www.youtube.com/embed/eCfDxZxTBW4

Вы также можете заменить watch?v= на embed/, поэтому http://www.youtube.com/watch?v=eCfDxZxTBW4 станет http://www.youtube.com/embed/eCfDxZxTBW4

156
ответ дан Wil 17 August 2018 в 12:47
поделиться
  • 1
    О прогресс ... Я бы хотел, чтобы они просто перенаправляли нас на страницу встраивания вместо того, чтобы вызывать ошибку, и заставляли меня переписывать мои скрипты! – joeytwiddle 3 February 2012 в 17:17

Попробуйте эту штуку, я не думаю, что кто-то предложил это в теме, это решит, как 70% вашей проблемы, для некоторых других страниц вам придется отказаться, у меня есть полное решение, но не для публики,

ДОБАВИТЬ ниже в ваш iframe

песочница = разрешить разрешающие скрипты разрешать-всплывающие окна разрешать-формы "

0
ответ дан Zulqurnain abbas 17 August 2018 в 12:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: