2009-08-11 6 views
1

Ich lade dynamisch eine Website über file_get_contents mit dem folgenden Skript.Einige Bilder laden nicht (CSS-Problem?)

<?php 
header('Content-Type: text/html; charset=iso-8859-1'); 

$url = (substr($_GET['url'], 0, 7) == 'http://') ? $_GET['url'] : "http://{$_GET['url']}"; 
$base_url = explode('/', $url); 
$base_url = (substr($url, 0, 7) == 'http://') ? $base_url[2] : $base_url[0]; 

if (file_get_contents($url) != false) { 

$content = @file_get_contents($url); 

// $search = array('@(<a\s*[^>]*href=[\'"]?(?![\'"]?http))@', '|(<img\s*[^>]*src=[\'"]?)|'); 
// $replace = array('\1proxy2.php?url=', '\1'.$url.'/'); 
// $new_content = preg_replace($search, $replace, $content); 


function prepend_proxy($matches) { 
    $url = (substr($_GET['url'], 0, 7) == 'http://') ? $_GET['url'] : "http://{$_GET['url']}"; 
    $prepend = $matches[2] ? $matches[2] : $url; 
    $prepend = 'http://h899310.devhost.se/proxy/proxy2.php?url='. $prepend .'/'; 

    return $matches[1] . $prepend . $matches[3]; 
} 

function imgprepend_proxy($matches2) { 
    $url = (substr($_GET['url'], 0, 7) == 'http://') ? $_GET['url'] : "http://{$_GET['url']}"; 
    $prepend2 = $matches2[2] ? $matches2[2] : $url; 
    $prepend2 = $prepend2 .'/'; 

    return $matches2[1] . $prepend2 . $matches2[3]; 
} 


$new_content = preg_replace_callback(
    '|(href=[\'"]?)(https?://)?([^\'"\s]+[\'"]?)|i', 
    'prepend_proxy', 
    preg_replace_callback(
     '|(src=[\'"]?)(https?://)?([^\'"\s]+[\'"]?)|i', 
     'imgprepend_proxy', 
     $content 
    ) 
); 

echo "<base href='http://{$base_url}' />"; 
echo $new_content; 


} else { 

    echo "Sidan kan inte visas"; 

} 
?> 

Jetzt ist das Problem, dass einige Bilder in Websites nicht angezeigt werden. Zum Beispiel solche Seiten, die CSS-Links haben. Es ist ein CSS-Problem, denke ich.

können Sie das Skript testen hier, um zu sehen, was ich meine:

http://h899310.devhost.se/proxy/index.html

Wie kann ich dieses Problem beheben?

+0

Okey, also ich habe eine Frage. Wie überprüfe ich, ob es eine .CSS-Datei ist, dann die $ url vor der Datei, wie mit der IMG-Prepend-Funktion, sondern mit CSS. Das würde es lösen, denke ich. Aber ich weiß nicht wie. –

Antwort

2

Es scheint, dass eine Ihrer URL-Ersatzmethoden einen Schrägstrich zu viele hinzufügt. Besuchen Sie eine der Seiten Ihres Proxy bietet, und Sie werden mehrere URLs sehen beginnend mit:

http:///www.msdn.com 

Nehmen Sie zum Beispiel das Laden msdn.com; die CSS wird nicht geladen, weil, wenn auf den Quellcode der proxy'd Seite suchen wir die URL zum CSS ist (man beachte den Baum mit Schrägstrichen) sehen:

http://h899310.devhost.se/proxy/proxy2.php?url=http:///i3.msdn.microsoft.com/global/global-bn20090721.css 

Anzeigen der URL direkt ein enthüllt in Ihrem Skript Warnung zeigt, dass file_get_contents die URL nicht laden kann:

Warning: file_get_contents(http:///i3.msdn.microsoft.com/global/global-bn20090721.css) [function.file-get-contents]: failed to open stream: No error in D:\users\u190790\h899310.devhost.se\Wwwroot\proxy\proxy2.php on line 9 
Sidan kan inte visas 

kurz auf den Code schauen, scheint es das Problem mit $prepend ist; Es sollte so aussehen, anstatt:

<?php 
$prepend = $matches2[2] ? $matches2[2] : $url . '/'; 
$prepend = $prepend; 
?> 
+0

Ja, jetzt zeigt es die Bilder der Seite. ABER! Nun gehen die Links auf der Seite NICHT wie vorher durch das Skript: proxy2.php? Url = asdsdasd –

1
header('Content-Type: text/html; charset=iso-8859-1'); 

Dies stellt die Proxy nur Text angezeigt werden; CSS und Bilder werden nicht über Ihren Proxy geladen (oder werden zumindest nicht korrekt angezeigt).