如果有人点击外部链接,我希望实现与deviantART相似的功能:示例:http://www.deviantart.com/users/outgoing?http://driz.co.uk/
实现此类功能的最佳方式是什么?从dA上的外观来看,他们只需编辑所有外部链接以获得http://www.deviantart.com/users/outgoing?
前缀,然后显示允许他们访问网站或返回的页面。所以也许我需要实现一种方法来检查哪些链接不在当前域上,然后在它们前面加上一个特殊的URL来显示踩踏石页面。
或者只是将rel="external"
附加到链接上,然后以某种方式将所有具有外部rel标签的链接转到该页面,或者显示一个显示相同消息的对话框。
干杯
答案 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
重要:
机器人从robots.txt
它与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);