Доступ к iframe с разных доменов.
Добрый день. У меня На странице есть iframe, вот он:
<iframe id="include_content" src="https://menu.food24h.ru" width="100%" frameborder="0"></iframe> Пытаюсь получить к нему доступ по средствам jquery, вот так:
$('iframe#include_content').contents()
В результате выхватиываю ошибку: Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://bistro-obed.ru" from accessing a cross-origin frame Из этого я понимаю что сайт на котором у меня установлен iframe против того что бы я получил доступ к нем. Пишу в заголовках и на первом и на втором сайте, вот это:
<?
header('Access-Control-Allow-Origin: *');
header('Origin: *');
?>
Но ошибка все равно остается, подскажите пожалуйста что делаю не так |
Попробуйте передать такие заголовки:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Credentials: true');
|
smart-create,
Добавьте на сайте в iframe:
window.addEventListener('message', function(e) {
if(e.origin === 'http://bistro-obed.ru') {
eval(e.data);
}
});
На основном сайте:
var frame = document.getElementById('include_content');
var evalCode = 'console.log(document.body)';
frame.contentWindow.postMessage(evalCode, '*');
Таким образом, Вы передаёте во iframe любой код, который хотите там выполнить. |
laimas, увы не помогло, я сам не понимаю почему, казалось бы должно все работать..., Вы случайно не знаете не может ли быть проблема в том что сайт bistro-obed.ru на котором я размещаю iframe работает на битриксе? может быть у битрикса есть какие то вшитые директивы запрещающие лезть в iframe?
|
ruslan_mart, спасибо за подсказку. Но у меня есть проблема с пониманием того как это должно работать.
То есть я беру код:
window.addEventListener('message', function(e) {
if(e.origin === 'http://bistro-obed.ru') {
eval(e.data);
}
});
вставляю его на сайт menu.food24h.ru (это страница которую я вставляю в iframe) а этот код:
var frame = document.getElementById('include_content');
var evalCode = 'console.log(document.body)';
frame.contentWindow.postMessage(evalCode, '*');
я вставляю на сайт bistro-obed.ru (стайт на на который я устанавливаю iframe с сайта menu.food24h.ru) Пожалуйста подскажите, правильно ли я все понял и сделал? Если да, то что я должен получить в итоге и как мне с этим работать? Я к сожалению пока не совсем понимаю как этот метод работает( |
Цитата:
Сайт ваш точно отдает добавленные заголовки, проверяли? |
laimas, дописал в методы OPTIONS и добавил header('Content-Type: text/html').
Проверил на обоих стайтах наличие добавленных заголовков, все на месте. Вот заголовки сайта на который вставляю iframe, а вот заголовки сайта который вставляю в iframe. Ошибка при вызове .contents() не меняется..( |
Что значит заголовки сайта и заголовки в iframe? Разрешение нужно для фрейма, а это отдельный запрос. Вы можете просто в .htassecc определить передачу этих заголовков и они будут передаваться всегда, давая разрешения на доступ. Здесь в учебнике описан механизм кроссдоменных запросов.
|
laimas, прошу прощения я не совсем правильно сформулировал свою мысль. Я просто хотел ответит на ваш предыдущий вопрос: "Да, я проверил заголовки которые добавил сайт отдает".
На счет htassecc, можно и через него конечно, но мне привычнее прямо на странице прописывать заголовки. Главное ведь что сайт их отдает? А каким образом их прописали по моему не имеет значения, поправьте меня если я не прав. А вот дальше я увы не понял что вы хотел сказать упоминаю кросс доменные запросы. Я понимаю как работают кросс доменные запросы, но я ведь не запросы делаю, я просто пытаюсь получить доступ к iframe, что бы можно было выполнять с его содержимым действия с помощью js. Я уже десятки раз использовал на страницах сайтов разные iframe и выполнял с ними действия с помощью .contents(). Всегда для этого хватало:
<?
header('Access-Control-Allow-Origin: *');
header('Origin: *');
?>
Я не понимаю что в этот раз пошло не так.., по этому и обратился за советом. |
Цитата:
Насчет "я же просто хочу", так исполнять или нет ваши желания браузер и определяет на основе обмена заголовками с сервером. Все в общем то в порядке. Попробуйте ради эксперимента выполнить Ajax запрос, данные будут доступны? |
| Часовой пояс GMT +3, время: 23:09. |