PHP传出/外部链接

时间:2010-11-05 18:23:23

标签: php external

如果有人点击外部链接,我希望实现与deviantART相似的功能:示例:http://www.deviantart.com/users/outgoing?http://driz.co.uk/

实现此类功能的最佳方式是什么?从dA上的外观来看,他们只需编辑所有外部链接以获得http://www.deviantart.com/users/outgoing?前缀,然后显示允许他们访问网站或返回的页面。所以也许我需要实现一种方法来检查哪些链接不在当前域上,然后在它们前面加上一个特殊的URL来显示踩踏石页面。

或者只是将rel="external"附加到链接上,然后以某种方式将所有具有外部rel标签的链接转到该页面,或者显示一个显示相同消息的对话框。

干杯

6 个答案:

答案 0 :(得分:3)

对于用户输入html使用正则表达式:

<\s*a\s+[^>]*href\s*=\s*[\"']?([^\"' >]+)[\"' >]

其中$ 1将是href,现在你可以测试:

(\w:\/{2})?([\w\.]+)

如果$ 2不是您的某个域,则需要重写href,因此在第一个regexp(php中的strpos)中找到$ 1的位置并添加你的掩码url

http://yourdomain.com/maskurl?

查询字符串将是您要重定向到的网址

另一方面,如果您使用给定的URL打印链接,则只需要传递第二个链接。

这里的第一个正则表达式:http://www.onaje.net/content/working-regular-expressions-href-url-extractor,另一个是我写的,但没有测试过。

答案 1 :(得分:2)

检测部分:链接只需要这种装饰,如果它是用户提供的可点击链接。您已经拥有将用户提供的链接转换为可点击链接的基础结构(否则,您有一个主要的安全问题),所以您需要做的就是将所有这些链接插入装饰器功能。

装饰部分:有一个函数接受一个URL参数。如果参数的第一部分是“http://your.domain.name”,或者它是相对链接(不是以像http://这样的协议开头),请不要管它。否则:

$url = "http://your.domain.name/outgoing.php?".urlencode($url);

这将确保正确转义原始网址中的所有未受保护的字符。

重定向部分:在outgoing.php脚本中,只需查看array_keys($_GET)内部以查找URL并显示相应的页面。

答案 2 :(得分:1)

最好的方法是更改​​链接,其中新URL将是您自己的脚本,根据查询字符串重定向用户。如果您希望保留与deviantArt相同的网址结构,请使用$_SERVER['QUERY_STRING']获取重定向脚本中的网址。

答案 3 :(得分:1)

优秀的帮助Netcoder。这是重定向部分的完整php:

<?php

$redirect = $_SERVER['QUERY_STRING'].'';

?>

<html><head>

<meta name="robots" content="noindex" />

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  


<title>Your Page title</title>

</head><body>

your Site Content

</body>

<SCRIPT LANGUAGE="JavaScript">

setTimeout("location.href ='<?php echo $redirect ?>'",30);

</script>

</html>
  

您的网站内容是您想要展示的内容。 30 是时候了   在重定向之前等待的秒数。将其保存为outgoing.php(或   任何东西)

外部链接必须采用以下格式:http://your-nice-domain.com/outgoing.php?http://the-external-domain.com/external-path.any

重要

  1. 机器人从robots.txt

  2. 输出这个php文件
  3. 它与dA相同,除了:重定向是自动的。

答案 4 :(得分:0)

根据页面的生成方式,有几种方法可以解决这个问题。如果所有链接都是由PHP生成的,那么可以通过将链接的URL与站点的URL进行比较来轻松完成。如果它们不同,请将您的passthough页面添加到URL的开头,类似于DA的操作方式。

我刚刚完成了一个脚本,在每个链接旁边添加外部链接图标,类似于维基百科的做法。对于这个特定的网站,我不得不使用许多具有静态内容的页面。使用我上面提到的PHP方法,不适合这个。相反,我在Javascript中实现了一些东西。使用jQuery,我选择所有以“http://”或“https://”开头的锚标签,然后循环浏览每个标签以检查域是否与我当前的域匹配。如果不同,我会在链接旁边添加图标。你可以做类似的事情,但是用你的passthough页面预先添加锚点的href。

答案 5 :(得分:0)

<?php
$html = '<a href="http://google.com/somethingelsewhere">Something</a>'
      . '<a href="http://example.com/somethinginmysite">My site!</a>';

echo preg_replace_callback('/<\s*a\s+[^>]*href\s*=\s*["\']?([^"\' >]+)["\' >]/', function($m) {
     // initialise the data variable from your object
     $link = $m[1];

     // early return
     if(strpos($link, 'http://example') === 0) return $m[0];

     $linklen = strlen($m[1]);
     $start = strlen($m[0]) - $linklen - 1;

     $replacement = 'http://example.com/mymask?link=' . urlencode($link);
     return substr_replace($m[0], $replacement, $start, $linklen);
}, $html);