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.