Разрешить доступ к содержимому фрейма
Нужно сделать так, чтобы к содержимому моей страницы был доступ через iframe (с другого домена)
Код, который я использую (iplg.22web.org/frame.php):
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: *");
header("Access-Control-Allow-Headers: *");
header("X-Frame-Options: ALLOW_FROM *");
?>
<h1>test</h1>
И JS с другого домена (bclib.22web.org):
let f = document.createElement('iframe');
f.src = 'http://iplg.22web.org/frame.php';
document.body.appendChild(f);
let doc = f.contentWindow.document;
И я либо получаю ошибку:
Uncaught DOMException: Blocked a frame with origin "http://bclib.22web.org" from accessing a cross-origin frame.
Либо нет, но контент страницы все равно недоступен:
> doc.body.innerHTML
< ''
Ответы (1 шт):
Контент страницы недоступен, потому что вы запрашиваете его до того, как он был загружен. Можно сделать так:
let f = document.createElement('iframe');
f.onload = function() {
console.log(f.contentDocument.body.innerHTML)
}
f.src = 'http://iplg.22web.org/frame.php';
document.body.appendChild(f);
UPD
Насколько я понял, вы не можете обойти кросс-доменную политику, если страница в iframe с другого домена. Но если у вас есть доступ ко второму домену, то можно использовать postMessage для обмена сообщениями:
window.onmessage = function(event) {
console.log(event.data);
};
let f = document.createElement('iframe');
f.onload = function() {
f.contentWindow.postMessage('getBody', '*');
}
f.src = 'http://some.domain/frame.php';
document.body.appendChild(f);
frame.php
<h1>test</h1>
<script>
window.onmessage = function(event) {
if(event.data == 'getBody') {
event.source.postMessage(document.body.innerHTML, event.origin);
}
};
</script>
UPD2
Обратил внимание, что ваши скрипты располагаются на поддоменах. В этом случае, есть решение проще:
document.domain = "22web.org";
let f = document.createElement('iframe');
f.onload = function() {
console.log(f.contentDocument.body.innerHTML);
}
f.src = 'http://iplg.22web.org/frame.php';
document.body.appendChild(f);
frame.php
<h1>test</h1>
<script>
document.domain = "22web.org";
</script>