0

基本上我想做的是,因为我为我的用户提供了在我的网站上分享评论和帖子中的链接的能力,当用户点击外部链接时让我的网站让它在我的页面中打开页面. 有点像脸书的做法。您将看到整个站点,但 facebook 的小导航栏将保留在您刚刚打开的站点的顶部。

我想复制这种行为,这样我就可以管理用户共享的链接,如果它们是无效或恶意的,则标记它们。所以我可以关掉它们。现在我已经在捕获链接并将它们存储在每个用户每个链接的基础上,以便我可以根据需要进行调节。但是为了让我的用户当前标记一个站点,他们必须回到我的站点,并遵循一个乏味的过程。我想做的是提供一个迷你导航,如果用户需要,它基本上可以选择在上面标记。也是为他们提供返回我网站的直接链接的一种方式。

所以我试图找出最好的方法。我应该通过 cURL 之类的东西拉取页面的全部内容,还是应该将它放在类似设置的框架中。或者,最好的方法是在跨平台和跨浏览器对桌面浏览器和移动浏览器友好的庄园中做到这一点。我可以预见如果我做类似 cURL 之类的事情,有人会恶意捣毁我,因为他们所要做的就是在某个地方转储一些卑鄙的代码,并且由于我的网站将它拾取并通过脚本拉取它,也许它会如何破坏我的网站,我不知道,我不经常使用 cURL 以了解是否存在任何重大风险。

那你说什么堆叠?某种 cURL 方法,框架,其他?有没有人可以指出一个很好的例子?

4

1 回答 1

0

如果您使用框架,那么一些网站可以跳出它们。如果您使用 CURL,则需要解析所有 url(链接、图像、脚本、css)并将它们更改为您自己的,如果您想将用户保留在您的站点中。所以 CURL 看起来更可靠,但它需要你做很多工作,并且它为你的站点产生了更多的带宽。如果您想要基于 CURL 的解决方案,您可以尝试在网上查找 Web 代理示例。

这是一个基本的工作代码,可以帮助您入门:

$url = isset($_GET['url']) ? $_GET['url'] : 'http://amazon.co.uk/'; 
$html = file_get_contents2($url);


$doc = new DOMDocument();
@$doc->loadHTML($html);
$xml = simplexml_import_dom($doc);

$host = 'http://' .parse_url($url, PHP_URL_HOST);
$proxy = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . '?url=';

$items['a']         = 'href';
$items['img']       = 'src';
$items['link']      = 'href';
$items['script']    = 'src';

foreach ($items AS $tag=>$attr)
{
    $elems = $xml->xpath('//' . $tag);
    foreach ($elems AS &$e)
    {
        if (substr($e[$attr], 0, 1) == '/')
        {
            $e[$attr] = $host . $e[$attr];
        } 
        if ($tag == 'a')
        {
            $e[$attr] = $proxy . urlencode($e[$attr]);
        }   
    }
}

$xmls = $xml->asXml();
$doc->loadXML($xmls);
$html = $doc->saveHTML();
echo $html;


function file_get_contents2($address)
{   
    $useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"; 

    $c = curl_init(); 
    curl_setopt($c, CURLOPT_URL, $address);
    curl_setopt($c, CURLOPT_USERAGENT, $useragent);     
    curl_setopt($c, CURLOPT_HEADER, 0);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($c, CURLOPT_FRESH_CONNECT, 1);
    if (!$data = curl_exec($c)) 
    {
        return false; 
    } 

    return $data;
}
于 2012-05-20T14:22:03.040 回答