单击外部链接时,如何模仿facebook的行为

时间:2012-05-20 13:55:17

标签: php html curl

基本上我想要做的是因为我为我的用户提供了在其中分享链接的能力,我的网站上的帖子是我的网站,当用户点击外部链接时,它在我的页面中打开页面说话的问题。有点像facebook的做法。您将完整地看到该网站,但facebooks小导航栏将保留在您刚刚打开的网站的顶部。

我想复制此行为,以便我可以审核用户共享的链接,如果它们无效或恶意,则标记它们。所以我可以把它们关掉。现在我已经捕获链接并将它们存储在每个链接的每个用户上,因此我可以根据需要调整。但是为了让我的用户现在标记一个网站,他们将不得不回到我的网站,并遵循一个单调乏味的过程。我想要做的是提供一个迷你导航,如果用户需要,它基本上可以选择标记它。也是一种为他们提供直接链接回我网站的方法。

所以我想弄清楚什么是最好的方式。我应该通过像cURL之类的东西来拉取页面的全部内容,还是应该在像设置这样的框架中使用它。或者最好的方法是在跨平台和跨浏览器友好的桌面浏览器和移动浏览器的庄园中做到这一点。如果我做像cURL这样的事情,我可以预见有人会狠狠地骂我,因为所有他们要做的就是在某个地方转储一些恶劣的代码,因为我的网站捡起它并通过脚本拉它可能会有一些如何打破我的网站我不知道,我不经常使用cURL来知道是否有任何重大风险。

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

1 个答案:

答案 0 :(得分:0)

如果你使用框架,那么一些网站可以跳出它们。如果您使用CURL,则需要解析所有网址(链接,图片,脚本,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;
}