Mocht je een pagina in een iframe laden en er komt niets tevoorschijn? Dan kan het zijn dat de volgende melding in de console staat:
Refused to display document because display forbidden by X-Frame-Options.
Maar wat kan je eraan doen? In het geval dat je Google Maps wilt “embedden” in je website ben je waarschijnlijk “&output=embed” vergeten in de url maar in alle andere gevallen wordt er veelal op het internet gezegd: pech, maar het kan niet. Om met een beter antwoord te komen, bij deze een “workaround”:
Laat ik het volgende bestand: iframe.php noemen:
<?php
if($_GET['url']) {
echo file_get_contents($_GET['url']);
}
?>
Vervolgens laden we de url voor het iframe via dit bestand:
<iframe src="iframe.php?url=http://website-welke-niet-wil-laden-in-een-iframe.nl/"></iframe>
En werken! Maar… zodra je op een link klikt kan het zijn dat het niet helemaal vlekkeloos gaat. Daar heb ik het volgende op bedacht:
<?php
/**
* Huidge URL ophalen
* @return string Volledige huidige url
*/
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on"){
$pageURL .= "s";
}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80"){
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
/**
* Volledige url maken
* @param string $url Huidige url
* @param array $host URL gegevens vanuit parse_url
* @return string Volledige url
*/
function nieuwe_url($url,$host)
{
$scheme = $host['scheme']; //http of https
$host = $scheme.'://'.$host['host'];
if($url != '#' AND $url != '')
{
// Begint met "//" ?
if(substr($url,0,2) == '//')
{
$url = $scheme.':'.$url;
// Begint met "/" ?
} elseif(substr($url,0,1) == '/')
{
$url = $host.$url;
// Wat voor opties zijn er nog meer?
} else {
$url = $url;
}
$url = curPageURL().'?url='.$url;
}
return $url;
}
/**
* En beginnen!
*/
if($_GET['url'])
{
// Content ophalen
$content = file_get_contents($_GET['url']);
// Gegevens uit de url halen
$url = parse_url($_GET['url']);
// HTML in DOM laden
$dom = new DOMDocument();
@$dom->loadHTML($content);
// Door alle "a" tags loopen
foreach($dom->getElementsByTagName('a') as $linkjes)
{
// Href ophalen
$href = $linkjes->getAttribute('href');
// Nieuwe url ophalen uit functie
$nieuw = nieuwe_url($href,$url);
// Href verwijderen
$linkjes->removeAttribute('href');
// Nieuwe href toevoegen
$linkjes->setAttribute('href', $nieuw);
}
// Het resultaat!
echo @$dom->saveHTML();
}
?>
Ik heb dit niet getest met alle websites! Maar bij de meeste zou dit moeten werken. Daarnaast dit nog even: de x-frame-options zijn er niet voor niets, het gebruik van deze methode is dan ook op eigen risico natuurlijk.